{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:22.531537Z",
     "start_time": "2024-08-05T08:06:12.808806Z"
    },
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T01:55:51.583163Z",
     "iopub.status.busy": "2025-02-07T01:55:51.582822Z",
     "iopub.status.idle": "2025-02-07T01:55:56.869060Z",
     "shell.execute_reply": "2025-02-07T01:55:56.868490Z",
     "shell.execute_reply.started": "2025-02-07T01:55:51.583138Z"
    },
    "id": "JHSdxPJuN4x7",
    "outputId": "a74dc274-dd24-4415-a3e4-1fcff4e437a2",
    "tags": []
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/lib/python3.10/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n",
      "  from .autonotebook import tqdm as notebook_tqdm\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "sys.version_info(major=3, minor=10, micro=14, releaselevel='final', serial=0)\n",
      "matplotlib 3.10.0\n",
      "numpy 1.26.4\n",
      "pandas 2.2.3\n",
      "sklearn 1.6.0\n",
      "torch 2.5.1+cu124\n",
      "cuda:0\n"
     ]
    }
   ],
   "source": [
    "import matplotlib as mpl\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "import numpy as np\n",
    "import sklearn\n",
    "import pandas as pd\n",
    "import os\n",
    "import sys\n",
    "import time\n",
    "from tqdm.auto import tqdm\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.nn.functional as F\n",
    "\n",
    "print(sys.version_info)\n",
    "for module in mpl, np, pd, sklearn, torch:\n",
    "    print(module.__name__, module.__version__)\n",
    "\n",
    "device = torch.device(\"cuda:0\") if torch.cuda.is_available() else torch.device(\"cpu\")\n",
    "print(device)\n",
    "\n",
    "seed = 42\n",
    "torch.manual_seed(seed)\n",
    "torch.cuda.manual_seed_all(seed)\n",
    "np.random.seed(seed)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:22.541540Z",
     "start_time": "2024-08-05T08:06:22.530536400Z"
    },
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T01:55:56.870252Z",
     "iopub.status.busy": "2025-02-07T01:55:56.869967Z",
     "iopub.status.idle": "2025-02-07T01:55:56.872885Z",
     "shell.execute_reply": "2025-02-07T01:55:56.872284Z",
     "shell.execute_reply.started": "2025-02-07T01:55:56.870230Z"
    },
    "id": "yQQEArYqWylq",
    "outputId": "bc80eeee-442a-4ff2-f69e-348314f84bce"
   },
   "outputs": [],
   "source": [
    "#挂载谷歌云盘\n",
    "\n",
    "# from google.colab import drive\n",
    "# drive.mount('/content/drive')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:22.552601Z",
     "start_time": "2024-08-05T08:06:22.536531800Z"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T01:55:56.874052Z",
     "iopub.status.busy": "2025-02-07T01:55:56.873648Z",
     "iopub.status.idle": "2025-02-07T01:55:56.876700Z",
     "shell.execute_reply": "2025-02-07T01:55:56.876092Z",
     "shell.execute_reply.started": "2025-02-07T01:55:56.874021Z"
    },
    "id": "wzS4AimwWz7f"
   },
   "outputs": [],
   "source": [
    "# !cp /content/drive/MyDrive/transformer-de-en/* . -r"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecutionIndicator": {
     "show": true
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T01:55:56.878566Z",
     "iopub.status.busy": "2025-02-07T01:55:56.878216Z",
     "iopub.status.idle": "2025-02-07T01:55:56.880907Z",
     "shell.execute_reply": "2025-02-07T01:55:56.880454Z",
     "shell.execute_reply.started": "2025-02-07T01:55:56.878529Z"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "# !rm -rf wmt16_cut/"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "55aNBForN4x9"
   },
   "source": [
    "## 数据加载\n",
    "\n",
    "- 采用WMT16的德语和英语平行语料库，数据集主页：[WMT16](https://www.statmt.org/wmt16/multimodal-task.html#task1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:22.608302700Z",
     "start_time": "2024-08-05T08:06:22.548590200Z"
    },
    "ExecutionIndicator": {
     "show": true
    },
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T01:55:56.881786Z",
     "iopub.status.busy": "2025-02-07T01:55:56.881493Z",
     "iopub.status.idle": "2025-02-07T01:56:06.287166Z",
     "shell.execute_reply": "2025-02-07T01:56:06.286550Z",
     "shell.execute_reply.started": "2025-02-07T01:55:56.881766Z"
    },
    "id": "SkjBEbr1N4x-",
    "outputId": "4b9817d0-616b-41a0-ceb7-9ff6bf0f42a1",
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Looking in indexes: https://mirrors.cloud.aliyuncs.com/pypi/simple\n",
      "Requirement already satisfied: sacremoses in /usr/local/lib/python3.10/site-packages (0.1.1)\n",
      "Requirement already satisfied: regex in /usr/local/lib/python3.10/site-packages (from sacremoses) (2024.11.6)\n",
      "Requirement already satisfied: click in /usr/local/lib/python3.10/site-packages (from sacremoses) (8.1.8)\n",
      "Requirement already satisfied: joblib in /usr/local/lib/python3.10/site-packages (from sacremoses) (1.4.2)\n",
      "Requirement already satisfied: tqdm in /usr/local/lib/python3.10/site-packages (from sacremoses) (4.67.1)\n",
      "\u001B[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001B[0m\u001B[33m\n",
      "\u001B[0m\n",
      "\u001B[1m[\u001B[0m\u001B[34;49mnotice\u001B[0m\u001B[1;39;49m]\u001B[0m\u001B[39;49m A new release of pip is available: \u001B[0m\u001B[31;49m23.3.2\u001B[0m\u001B[39;49m -> \u001B[0m\u001B[32;49m25.0\u001B[0m\n",
      "\u001B[1m[\u001B[0m\u001B[34;49mnotice\u001B[0m\u001B[1;39;49m]\u001B[0m\u001B[39;49m To update, run: \u001B[0m\u001B[32;49mpip install --upgrade pip\u001B[0m\n",
      "Looking in indexes: https://mirrors.cloud.aliyuncs.com/pypi/simple\n",
      "Requirement already satisfied: subword-nmt in /usr/local/lib/python3.10/site-packages (0.3.8)\n",
      "Requirement already satisfied: mock in /usr/local/lib/python3.10/site-packages (from subword-nmt) (5.1.0)\n",
      "Requirement already satisfied: tqdm in /usr/local/lib/python3.10/site-packages (from subword-nmt) (4.67.1)\n",
      "\u001B[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001B[0m\u001B[33m\n",
      "\u001B[0m\n",
      "\u001B[1m[\u001B[0m\u001B[34;49mnotice\u001B[0m\u001B[1;39;49m]\u001B[0m\u001B[39;49m A new release of pip is available: \u001B[0m\u001B[31;49m23.3.2\u001B[0m\u001B[39;49m -> \u001B[0m\u001B[32;49m25.0\u001B[0m\n",
      "\u001B[1m[\u001B[0m\u001B[34;49mnotice\u001B[0m\u001B[1;39;49m]\u001B[0m\u001B[39;49m To update, run: \u001B[0m\u001B[32;49mpip install --upgrade pip\u001B[0m\n"
     ]
    }
   ],
   "source": [
    "#和jieba分词类似\n",
    "!pip install sacremoses\n",
    "!pip install subword-nmt\n",
    "# # BPE分词\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "ExecutionIndicator": {
     "show": true
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T01:56:06.288637Z",
     "iopub.status.busy": "2025-02-07T01:56:06.288022Z",
     "iopub.status.idle": "2025-02-07T01:56:06.403161Z",
     "shell.execute_reply": "2025-02-07T01:56:06.402608Z",
     "shell.execute_reply.started": "2025-02-07T01:56:06.288597Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "/mnt/workspace/transformer\n"
     ]
    }
   ],
   "source": [
    "!pwd"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:22.609302200Z",
     "start_time": "2024-08-05T08:06:22.565115500Z"
    },
    "ExecutionIndicator": {
     "show": true
    },
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T01:56:06.404347Z",
     "iopub.status.busy": "2025-02-07T01:56:06.403853Z",
     "iopub.status.idle": "2025-02-07T01:56:06.406768Z",
     "shell.execute_reply": "2025-02-07T01:56:06.406326Z",
     "shell.execute_reply.started": "2025-02-07T01:56:06.404306Z"
    },
    "id": "Tc8aCQX-XrGv",
    "outputId": "67964082-2737-4d47-dd66-455e4ae69660",
    "tags": []
   },
   "outputs": [],
   "source": [
    "# !sh data_multi30k.sh wmt16 wmt16_cut de en"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "Lvk4q0-1N4x-"
   },
   "source": [
    "Dataset"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:22.811204Z",
     "start_time": "2024-08-05T08:06:22.581320400Z"
    },
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T01:56:06.407565Z",
     "iopub.status.busy": "2025-02-07T01:56:06.407392Z",
     "iopub.status.idle": "2025-02-07T01:56:06.468259Z",
     "shell.execute_reply": "2025-02-07T01:56:06.467774Z",
     "shell.execute_reply.started": "2025-02-07T01:56:06.407546Z"
    },
    "id": "zCXKEwspN4x_",
    "outputId": "3dcce6fa-932f-4b22-9dc8-398a4b402733"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "load train dataset from wmt16/.cache/de2en_train_128.npy\n",
      "load val dataset from wmt16/.cache/de2en_val_128.npy\n"
     ]
    }
   ],
   "source": [
    "from pathlib import Path\n",
    "from torch.utils.data import Dataset, DataLoader\n",
    "\n",
    "\n",
    "\n",
    "class LangPairDataset(Dataset):\n",
    "\n",
    "    def __init__(\n",
    "        self, mode=\"train\", max_length=128, overwrite_cache=False, data_dir=\"wmt16\",\n",
    "    ):\n",
    "        self.data_dir = Path(data_dir)\n",
    "        cache_path = self.data_dir / \".cache\" / f\"de2en_{mode}_{max_length}.npy\"\n",
    "\n",
    "        if overwrite_cache or not cache_path.exists():\n",
    "            cache_path.parent.mkdir(parents=True, exist_ok=True)\n",
    "\n",
    "            with open(self.data_dir / f\"{mode}_src.bpe\", \"r\", encoding=\"utf8\") as file:\n",
    "                self.src = file.readlines() # 读取源语言文件所有行\n",
    "\n",
    "            with open(self.data_dir / f\"{mode}_trg.bpe\", \"r\", encoding=\"utf8\") as file:\n",
    "                self.trg = file.readlines() # 读取目标语言文件所有行\n",
    "\n",
    "            filtered_src = []\n",
    "            filtered_trg = []\n",
    "            # max length filter,超出最大长度的句子舍弃\n",
    "            for src, trg in zip(self.src, self.trg):\n",
    "                if len(src) <= max_length and len(trg) <= max_length: # 过滤长度超过最大长度的句子\n",
    "                    filtered_src.append(src.strip()) # 去掉句子前后的空格\n",
    "                    filtered_trg.append(trg.strip())\n",
    "            filtered_src = np.array(filtered_src)\n",
    "            filtered_trg = np.array(filtered_trg)\n",
    "            np.save(\n",
    "                cache_path,\n",
    "                {\"src\": filtered_src, \"trg\": filtered_trg },\n",
    "                allow_pickle=True,\n",
    "            )#allow_pickle=True允许保存对象数组，将过滤后的数据保存为 NumPy 数组，存储在缓存文件中\n",
    "            print(f\"save cache to {cache_path}\")\n",
    "\n",
    "        else:\n",
    "            cache_dict = np.load(cache_path, allow_pickle=True).item() #allow_pickle=True允许保存对象数组\n",
    "            print(f\"load {mode} dataset from {cache_path}\")\n",
    "            filtered_src = cache_dict[\"src\"]\n",
    "            filtered_trg = cache_dict[\"trg\"]\n",
    "\n",
    "        self.src = filtered_src\n",
    "        self.trg = filtered_trg\n",
    "\n",
    "    def __getitem__(self, index):\n",
    "        return self.src[index], self.trg[index]\n",
    "\n",
    "    def __len__(self):\n",
    "        return len(self.src)\n",
    "\n",
    "\n",
    "train_ds = LangPairDataset(\"train\")\n",
    "val_ds = LangPairDataset(\"val\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:22.820353700Z",
     "start_time": "2024-08-05T08:06:22.812366100Z"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T01:56:06.469055Z",
     "iopub.status.busy": "2025-02-07T01:56:06.468824Z",
     "iopub.status.idle": "2025-02-07T01:56:06.471418Z",
     "shell.execute_reply": "2025-02-07T01:56:06.470952Z",
     "shell.execute_reply.started": "2025-02-07T01:56:06.469035Z"
    },
    "id": "yHB9TDpDQlv2"
   },
   "outputs": [],
   "source": [
    "# !rm wmt16/.cache -r"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:22.869376300Z",
     "start_time": "2024-08-05T08:06:22.816345900Z"
    },
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T01:56:06.473752Z",
     "iopub.status.busy": "2025-02-07T01:56:06.473506Z",
     "iopub.status.idle": "2025-02-07T01:56:06.477949Z",
     "shell.execute_reply": "2025-02-07T01:56:06.477460Z",
     "shell.execute_reply.started": "2025-02-07T01:56:06.473732Z"
    },
    "id": "meHHXL3MN4x_",
    "outputId": "a001c071-7021-4dff-8bc0-3e5da01d7210"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "27659"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(train_ds) #少了1000多个样本"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:22.870386300Z",
     "start_time": "2024-08-05T08:06:22.844639700Z"
    },
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T01:56:06.478690Z",
     "iopub.status.busy": "2025-02-07T01:56:06.478440Z",
     "iopub.status.idle": "2025-02-07T01:56:06.481467Z",
     "shell.execute_reply": "2025-02-07T01:56:06.480953Z",
     "shell.execute_reply.started": "2025-02-07T01:56:06.478671Z"
    },
    "id": "LZvJV37NN4x_",
    "outputId": "43909dbd-cf15-447b-e8b6-a07de381ad0a"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "source: ein älterer mann sitzt mit einem jungen mit einem wagen vor einer fassade .\n",
      "target: an elderly man sits outside a storefront accompani@@ ed by a young boy with a cart .\n"
     ]
    }
   ],
   "source": [
    "print(\"source: {}\\ntarget: {}\".format(*train_ds[-1]))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "TE8gRzYQN4yA"
   },
   "source": [
    "### Tokenizer\n",
    "\n",
    "这里有两种处理方式，分别对应着 encoder 和 decoder 的 word embedding 是否共享，这里实现共享的方案"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:23.012615500Z",
     "start_time": "2024-08-05T08:06:22.857384400Z"
    },
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 66,
     "referenced_widgets": [
      "7190c928edb040c3a523cdd2e3f45572",
      "990741ff083d457587665d8f620b69c3",
      "00fe6a550df547cea5b1e0d84c1a3f5f",
      "fab8b1e3187841ee894b92859fa4821b",
      "f9b0d916e1a64c2a9f384e42f3d5dcab",
      "a78199650ecc47bd81f482a2671b563a",
      "673bd3773a374261a01cfc48081c27f3",
      "83f345f7424c43929d7a304cbfb6d0fe",
      "58d69d086f644e89937347e1f9261d6f",
      "8cf462fa996c41b18fb4571e0a757363",
      "434ac4c51db74681942d2d3bd869b1df"
     ]
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T01:56:06.482220Z",
     "iopub.status.busy": "2025-02-07T01:56:06.481946Z",
     "iopub.status.idle": "2025-02-07T01:56:06.510724Z",
     "shell.execute_reply": "2025-02-07T01:56:06.510270Z",
     "shell.execute_reply.started": "2025-02-07T01:56:06.482200Z"
    },
    "id": "yAmlq_9YN4yA",
    "outputId": "263a89f7-9bee-4c6d-cf7a-7d82b0a81f92"
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 18107/18107 [00:00<00:00, 959147.55it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "vocab_size: 18111\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "#载入词表，看下词表长度，词表就像英语字典,构建word2idx和idx2word\n",
    "word2idx = {\n",
    "    \"[PAD]\": 0,     # 填充 token\n",
    "    \"[BOS]\": 1,     # begin of sentence\n",
    "    \"[UNK]\": 2,     # 未知 token\n",
    "    \"[EOS]\": 3,     # end of sentence\n",
    "}\n",
    "idx2word = {value: key for key, value in word2idx.items()}\n",
    "index = len(idx2word)\n",
    "threshold = 1  # 出现次数低于此的token舍弃\n",
    "\n",
    "with open(\"wmt16/vocab\", \"r\", encoding=\"utf8\") as file:\n",
    "    for line in tqdm(file.readlines()):\n",
    "        token, counts = line.strip().split()\n",
    "        if int(counts) >= threshold:\n",
    "            word2idx[token] = index\n",
    "            idx2word[index] = token\n",
    "            index += 1\n",
    "\n",
    "vocab_size = len(word2idx)\n",
    "print(\"vocab_size: {}\".format(vocab_size))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:23.015614600Z",
     "start_time": "2024-08-05T08:06:22.932228100Z"
    },
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T01:56:06.511561Z",
     "iopub.status.busy": "2025-02-07T01:56:06.511250Z",
     "iopub.status.idle": "2025-02-07T01:56:06.557580Z",
     "shell.execute_reply": "2025-02-07T01:56:06.557124Z",
     "shell.execute_reply.started": "2025-02-07T01:56:06.511542Z"
    },
    "id": "e_ed0jmJN4yA",
    "outputId": "407a9e69-4981-42ae-c7a9-aa4c701185ef"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "raw text\n",
      "['hello', 'world']\n",
      "['tokenize', 'text', 'datas', 'with', 'batch']\n",
      "['this', 'is', 'a', 'test']\n",
      "indices\n",
      "tensor([   1, 9458, 3522,    3,    0,    0,    0])\n",
      "tensor([   1,    2, 5463,    2,   22,    2,    3])\n",
      "tensor([   1,  385,   18,    5, 5699,    3,    0])\n",
      "decode text\n",
      "[BOS] hello world [EOS] [PAD] [PAD] [PAD]\n",
      "[BOS] [UNK] text [UNK] with [UNK] [EOS]\n",
      "[BOS] this is a test [EOS] [PAD]\n"
     ]
    }
   ],
   "source": [
    "class Tokenizer:\n",
    "    def __init__(self, word2idx, idx2word, max_length=128, pad_idx=0, bos_idx=1, eos_idx=3, unk_idx=2):\n",
    "        self.word2idx = word2idx\n",
    "        self.idx2word = idx2word\n",
    "        self.max_length = max_length\n",
    "        self.pad_idx = pad_idx\n",
    "        self.bos_idx = bos_idx\n",
    "        self.eos_idx = eos_idx\n",
    "        self.unk_idx = unk_idx\n",
    "\n",
    "    def encode(self, text_list, padding_first=False, add_bos=True, add_eos=True, return_mask=False):\n",
    "        \"\"\"如果padding_first == True，则padding加载前面，否则加载后面\"\"\"\n",
    "        max_length = min(self.max_length, add_eos + add_bos + max([len(text) for text in text_list]))\n",
    "        indices_list = []\n",
    "        for text in text_list:\n",
    "            indices = [self.word2idx.get(word, self.unk_idx) for word in text[:max_length - add_bos - add_eos]]\n",
    "            if add_bos:\n",
    "                indices = [self.bos_idx] + indices\n",
    "            if add_eos:\n",
    "                indices = indices + [self.eos_idx]\n",
    "            if padding_first:\n",
    "                indices = [self.pad_idx] * (max_length - len(indices)) + indices\n",
    "            else:\n",
    "                indices = indices + [self.pad_idx] * (max_length - len(indices))\n",
    "            indices_list.append(indices)\n",
    "        input_ids = torch.tensor(indices_list)\n",
    "        masks = (input_ids == self.pad_idx).to(dtype=torch.int64) # 为了方便损失计算，这里的mask为0的地方需要计算，为1的地方不需要计算\n",
    "        return input_ids if not return_mask else (input_ids, masks)\n",
    "\n",
    "\n",
    "    def decode(self, indices_list, remove_bos=True, remove_eos=True, remove_pad=True, split=False):\n",
    "        text_list = []\n",
    "        for indices in indices_list:\n",
    "            text = []\n",
    "            for index in indices:\n",
    "                word = self.idx2word.get(index, \"[UNK]\")\n",
    "                if remove_bos and word == \"[BOS]\":\n",
    "                    continue\n",
    "                if remove_eos and word == \"[EOS]\":\n",
    "                    break\n",
    "                if remove_pad and word == \"[PAD]\":\n",
    "                    break\n",
    "                text.append(word)\n",
    "            text_list.append(\" \".join(text) if not split else text)\n",
    "        return text_list\n",
    "\n",
    "\n",
    "tokenizer = Tokenizer(word2idx=word2idx, idx2word=idx2word)\n",
    "\n",
    "tokenizer.encode([[\"hello\"], [\"hello\", \"world\"]], add_bos=True, add_eos=False)\n",
    "raw_text = [\"hello world\".split(), \"tokenize text datas with batch\".split(), \"this is a test\".split()]\n",
    "indices = tokenizer.encode(raw_text, padding_first=False, add_bos=True, add_eos=True)\n",
    "decode_text = tokenizer.decode(indices.tolist(), remove_bos=False, remove_eos=False, remove_pad=False)\n",
    "print(\"raw text\")\n",
    "for raw in raw_text:\n",
    "    print(raw)\n",
    "print(\"indices\")\n",
    "for index in indices:\n",
    "    print(index)\n",
    "print(\"decode text\")\n",
    "for decode in decode_text:\n",
    "    print(decode)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:23.016615500Z",
     "start_time": "2024-08-05T08:06:22.985590600Z"
    },
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2025-02-07T01:56:06.558486Z",
     "iopub.status.busy": "2025-02-07T01:56:06.558072Z",
     "iopub.status.idle": "2025-02-07T01:56:06.561259Z",
     "shell.execute_reply": "2025-02-07T01:56:06.560746Z",
     "shell.execute_reply.started": "2025-02-07T01:56:06.558451Z"
    },
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "72\n",
      "54\n"
     ]
    }
   ],
   "source": [
    "for i,j in train_ds:\n",
    "    print(len(i))\n",
    "    print(len(j))\n",
    "    break"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "ftcEnnKxN4yB"
   },
   "source": [
    "### Transformer Batch Sampler\n",
    "\n",
    "> Sentence pairs were batched together by approximate sequence length. Each training batch contained a set of sentence pairs containing approximately 25000 source tokens and 25000 target tokens\n",
    "句子按照序列长度差不多的分到一个批次。 每个训练批次包含一组句子对，其中包含大约 25000 个源标记和 25000 个目标标记"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:23.046108400Z",
     "start_time": "2024-08-05T08:06:22.990095800Z"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T01:56:06.562082Z",
     "iopub.status.busy": "2025-02-07T01:56:06.561806Z",
     "iopub.status.idle": "2025-02-07T01:56:06.567876Z",
     "shell.execute_reply": "2025-02-07T01:56:06.567413Z",
     "shell.execute_reply.started": "2025-02-07T01:56:06.562063Z"
    },
    "id": "qP8nznIuN4yB"
   },
   "outputs": [],
   "source": [
    "class SampleInfo: #下面的info对象\n",
    "    def __init__(self, i, lens):\n",
    "        \"\"\"\n",
    "        记录文本对的序号和长度信息\n",
    "        输入：\n",
    "            - i (int): 文本对的序号。\n",
    "            - lens (list): 文本对源语言和目标语言的长度\n",
    "        \"\"\"\n",
    "        self.i = i\n",
    "        # 加一是考虑填补在文本前后的特殊词元，lens[0]和lens[1]分别表示源语言和目标语言的长度\n",
    "        self.max_len = max(lens[0], lens[1]) + 1\n",
    "        self.src_len = lens[0] + 1\n",
    "        self.trg_len = lens[1] + 1\n",
    "\n",
    "# 一个批量生成器，根据词元数目的限制来控制批量的大小。它会根据传入的样本信息，在不超过设定大小的情况下，逐步构建批量。\n",
    "class TokenBatchCreator:\n",
    "    def __init__(self, batch_size):\n",
    "        \"\"\"\n",
    "        参数:\n",
    "        batch_size (int): 用于限制批量的大小。\n",
    "        功能:\n",
    "        初始化了一个空的批量列表 _batch。\n",
    "        设定了初始的最大长度为 -1。\n",
    "        存储了传入的 batch_size。\n",
    "        \"\"\"\n",
    "\n",
    "        self._batch = []  #这个就是之前的batch_size，就是第一个batch内有多少个样本\n",
    "        self.max_len = -1\n",
    "        self._batch_size = batch_size # 限制批量的大小,假设是4096\n",
    "\n",
    "    def append(self, info):\n",
    "        \"\"\"\n",
    "        参数:\n",
    "        info (SampleInfo): 文本对的信息。\n",
    "        功能:\n",
    "        接收一个 SampleInfo 对象，并根据其最大长度信息更新当前批量的最大长度。\n",
    "        如果将新的样本加入批量后超过了批量大小限制，它会返回已有的批量并将新的样本加入新的批量。\n",
    "        否则，它会更新最大长度并将样本添加到当前批量中。\n",
    "        \"\"\"\n",
    "        # 更新当前批量的最大长度\n",
    "        cur_len = info.max_len # 当前样本的长度\n",
    "        max_len = max(self.max_len, cur_len) # 每来一个样本，更新当前批次的最大长度\n",
    "        # 如果新的样本加入批量后超过大小限制，则将已有的批量返回，新的样本加入新的批量\n",
    "        if max_len * (len(self._batch) + 1) > self._batch_size:\n",
    "            self._batch, result = [], self._batch # 保存当前的batch，并返回,这里的result是之前的batch,_batch清空\n",
    "            self._batch.append(info) #箱子里的第一条样本，放入\n",
    "            self.max_len = cur_len #因为是当前batch的第一个样本，所以它的长度就是当前长度\n",
    "            return result\n",
    "        else:\n",
    "            self.max_len = max_len\n",
    "            self._batch.append(info) # 将样本添加到当前批量中\n",
    "            return None\n",
    "\n",
    "    @property\n",
    "    def batch(self):\n",
    "        return self._batch"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:23.149062600Z",
     "start_time": "2024-08-05T08:06:23.013615200Z"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T01:56:06.568767Z",
     "iopub.status.busy": "2025-02-07T01:56:06.568475Z",
     "iopub.status.idle": "2025-02-07T01:56:06.576493Z",
     "shell.execute_reply": "2025-02-07T01:56:06.576019Z",
     "shell.execute_reply.started": "2025-02-07T01:56:06.568748Z"
    },
    "id": "_Vtc0gXEN4yB"
   },
   "outputs": [],
   "source": [
    "from torch.utils.data import BatchSampler\n",
    "import numpy as np\n",
    "\n",
    "\n",
    "class TransformerBatchSampler(BatchSampler):\n",
    "    def __init__(self,\n",
    "                 dataset,\n",
    "                 batch_size,\n",
    "                 shuffle_batch=False,\n",
    "                 clip_last_batch=False,\n",
    "                 seed=0):\n",
    "        \"\"\"\n",
    "        批量采样器\n",
    "        输入:\n",
    "            - dataset: 数据集\n",
    "            - batch_size: 批量大小\n",
    "            - shuffle_batch: 是否对生成的批量进行洗牌\n",
    "            - clip_last_batch: 是否裁剪最后剩下的数据\n",
    "            - seed: 随机数种子\n",
    "        \"\"\"\n",
    "        self._dataset = dataset\n",
    "        self._batch_size = batch_size\n",
    "        self._shuffle_batch = shuffle_batch\n",
    "        self._clip_last_batch = clip_last_batch\n",
    "        self._seed = seed\n",
    "        self._random = np.random\n",
    "        self._random.seed(seed)\n",
    "\n",
    "        self._sample_infos = []\n",
    "        # 根据数据集中的每个样本，创建了对应的 SampleInfo 对象，包含了样本的索引和长度信息。\n",
    "        for i, data in enumerate(self._dataset):\n",
    "            lens = [len(data[0]), len(data[1])] #输入和输出的长度计算放到lens中\n",
    "            self._sample_infos.append(SampleInfo(i, lens))\n",
    "\n",
    "    def __iter__(self):\n",
    "        \"\"\"\n",
    "        对数据集中的样本进行排序，排序规则是先按源语言长度排序，如果相同则按目标语言长度排序。\n",
    "        使用 TokenBatchCreator 逐步组装批量数据，当满足批量大小时返回一个批量的样本信息。\n",
    "        如果不裁剪最后一个批次的数据且存在剩余样本，则将这些样本组成最后一个批次。\n",
    "        如果需要对批量进行洗牌，则对批次进行洗牌操作。\n",
    "        通过迭代器，抛出每个批量的样本在数据集中的索引。\n",
    "        \"\"\"\n",
    "        # 排序，如果源语言长度相同则按照目标语言的长度排列\n",
    "        infos = sorted(self._sample_infos,\n",
    "                       key=lambda x: (x.src_len, x.trg_len))\n",
    "        # 组装批量，所有的batch都放入batch_infos\n",
    "        batch_infos = []\n",
    "        batch_creator = TokenBatchCreator(self._batch_size) # 批量生成器\n",
    "        for info in infos:\n",
    "            batch = batch_creator.append(info)\n",
    "            # 存够一个batch的样本信息后，会把这个batch返回，否则返回为None\n",
    "            if batch is not None:\n",
    "                batch_infos.append(batch)\n",
    "\n",
    "        # 是否抛弃最后批量的文本对\n",
    "        if not self._clip_last_batch and len(batch_creator.batch) != 0:\n",
    "            batch_infos.append(batch_creator.batch) # 最后一个batch\n",
    "\n",
    "        # 打乱batch\n",
    "        if self._shuffle_batch:\n",
    "            self._random.shuffle(batch_infos)\n",
    "\n",
    "        self.batch_number = len(batch_infos)\n",
    "        # print(self.batch_number) #为了理解\n",
    "\n",
    "        # 抛出一个批量的文本对在数据集中的序号\n",
    "        for batch in batch_infos:\n",
    "            batch_indices = [info.i for info in batch] # 批量的样本在数据集中的索引，第一个batch[0,1,.....82]，第二个batch[83,84,85,86,87]\n",
    "            yield batch_indices\n",
    "\n",
    "    def __len__(self):\n",
    "        \"\"\"\n",
    "        返回批量的数量\n",
    "        \"\"\"\n",
    "        if hasattr(self, \"batch_number\"):\n",
    "            return self.batch_number\n",
    "        # 计算批量的数量,没有用到下面的情况，不用看\n",
    "        batch_number = (len(self._dataset) +\n",
    "                        self._batch_size) // self._batch_size\n",
    "        return batch_number"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:23.259543600Z",
     "start_time": "2024-08-05T08:06:23.021123200Z"
    },
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T01:56:06.577378Z",
     "iopub.status.busy": "2025-02-07T01:56:06.577078Z",
     "iopub.status.idle": "2025-02-07T01:56:06.758969Z",
     "shell.execute_reply": "2025-02-07T01:56:06.758423Z",
     "shell.execute_reply.started": "2025-02-07T01:56:06.577358Z"
    },
    "id": "d00AFRzVN4yC",
    "outputId": "a43c1a14-102f-4cbb-fff1-761cb46e31b3"
   },
   "outputs": [],
   "source": [
    "sampler = TransformerBatchSampler(train_ds, batch_size=4096, shuffle_batch=True)\n",
    "\n",
    "#为什么这里每个批量的样本对数目不一样呢？长度*batch_number>4096的时候，就会返回上一个batch，然后新的样本加入新的batch,具体要看TokenBatchCreator的44行"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:23.319151500Z",
     "start_time": "2024-08-05T08:06:23.259543600Z"
    },
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2025-02-07T01:56:06.759857Z",
     "iopub.status.busy": "2025-02-07T01:56:06.759603Z",
     "iopub.status.idle": "2025-02-07T01:56:06.796055Z",
     "shell.execute_reply": "2025-02-07T01:56:06.795573Z",
     "shell.execute_reply.started": "2025-02-07T01:56:06.759837Z"
    },
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "第0批量的数据中含有文本对是：[20303, 272, 3549, 11130, 12595, 12784, 13559, 22464, 1474, 6750, 7174, 8451, 10507, 15759, 16727, 19970, 25362, 27342, 27467, 2093, 2953, 3053, 4811, 6859, 10441, 10853, 11970, 15839, 16938, 18233, 20382, 21262, 24568, 14, 1067, 4934, 10278, 11027, 11753, 12988, 15029, 15900, 16219, 16799, 19208, 20018, 21926, 2490, 2565, 2854, 3903, 6469, 8006, 9892, 10241, 10400, 11697, 13678, 17015, 19819, 20660, 23208, 25640, 4620, 5719, 7807, 9474, 11360, 11423, 11857, 12519, 14495, 16832, 17204, 17214, 22914, 23865, 25037, 26610, 27438, 365, 1063, 3404]，数量为：83\n",
      "第1批量的数据中含有文本对是：[1896, 2650, 5347, 6855, 13019, 14422, 15533, 17704, 20935, 21794, 27107, 2422, 5213, 6555, 6638, 7682, 7902, 14492, 19817, 20186, 20941, 21052, 21164, 21222, 23422, 23573, 23834, 24516, 24599, 528, 933, 5364, 7649, 8029, 12179, 16073, 17508, 17732, 20361, 21449, 25890, 26193, 26438, 1469, 5758, 9238, 10232, 16510, 17373]，数量为：49\n",
      "第2批量的数据中含有文本对是：[6311, 19570, 21049, 21560, 24196, 24600, 12012, 12977, 23611, 24911, 26514, 2573, 6205, 8269, 22566, 23845, 24888, 16511, 13479, 14827, 24583, 11595, 13740, 16399, 23925, 3068, 4682, 6643, 21833, 51, 2894, 4777, 6227, 10547, 20315]，数量为：35\n",
      "第3批量的数据中含有文本对是：[12483, 18790, 19995, 22195, 27532, 8260, 11850, 15860, 21670, 8611, 15832, 19348, 21688, 3206, 20749, 27041, 27254, 9762, 12951, 19090, 19566, 5503, 6830, 9750, 12289, 18415, 19626, 20953, 23116, 252, 1881, 3617, 13355, 13982, 16612, 26396]，数量为：36\n"
     ]
    }
   ],
   "source": [
    "for idx, batch in enumerate(sampler):\n",
    "    print(\"第{}批量的数据中含有文本对是：{}，数量为：{}\".format(idx, batch, len(batch)))\n",
    "    if idx >= 3:\n",
    "        break"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:23.319151500Z",
     "start_time": "2024-08-05T08:06:23.302665100Z"
    },
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2025-02-07T01:56:06.797043Z",
     "iopub.status.busy": "2025-02-07T01:56:06.796630Z",
     "iopub.status.idle": "2025-02-07T01:56:06.800287Z",
     "shell.execute_reply": "2025-02-07T01:56:06.799827Z",
     "shell.execute_reply.started": "2025-02-07T01:56:06.797021Z"
    },
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "533"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(sampler)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "Olkaw4JNN4yC"
   },
   "source": [
    "### DataLoader"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:23.319151500Z",
     "start_time": "2024-08-05T08:06:23.311772900Z"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T01:56:06.801113Z",
     "iopub.status.busy": "2025-02-07T01:56:06.800825Z",
     "iopub.status.idle": "2025-02-07T01:56:06.805633Z",
     "shell.execute_reply": "2025-02-07T01:56:06.805152Z",
     "shell.execute_reply.started": "2025-02-07T01:56:06.801094Z"
    },
    "id": "rvvuNJIzN4yC"
   },
   "outputs": [],
   "source": [
    "def collate_fct(batch, tokenizer):\n",
    "    src_words = [pair[0].split() for pair in batch]\n",
    "    trg_words = [pair[1].split() for pair in batch]\n",
    "\n",
    "    # [BOS] src [EOS] [PAD]\n",
    "    encoder_inputs, encoder_inputs_mask = tokenizer.encode(\n",
    "        src_words, padding_first=False, add_bos=True, add_eos=True, return_mask=True\n",
    "        )\n",
    "\n",
    "    # [BOS] trg [PAD]\n",
    "    decoder_inputs = tokenizer.encode(\n",
    "        trg_words, padding_first=False, add_bos=True, add_eos=False, return_mask=False,\n",
    "        )\n",
    "\n",
    "    # trg [EOS] [PAD]\n",
    "    decoder_labels, decoder_labels_mask = tokenizer.encode(\n",
    "        trg_words, padding_first=False, add_bos=False, add_eos=True, return_mask=True\n",
    "        )\n",
    "\n",
    "    return {\n",
    "        \"encoder_inputs\": encoder_inputs.to(device=device),\n",
    "        \"encoder_inputs_mask\": encoder_inputs_mask.to(device=device),\n",
    "        \"decoder_inputs\": decoder_inputs.to(device=device),\n",
    "        \"decoder_labels\": decoder_labels.to(device=device),\n",
    "        \"decoder_labels_mask\": decoder_labels_mask.to(device=device),\n",
    "    }\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:24.107023100Z",
     "start_time": "2024-08-05T08:06:23.321149400Z"
    },
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T01:56:06.806345Z",
     "iopub.status.busy": "2025-02-07T01:56:06.806162Z",
     "iopub.status.idle": "2025-02-07T01:56:07.021608Z",
     "shell.execute_reply": "2025-02-07T01:56:07.020972Z",
     "shell.execute_reply.started": "2025-02-07T01:56:06.806326Z"
    },
    "id": "5p79gPo5N4yC",
    "outputId": "2b1d43ae-a2ed-4333-8274-50c62c2fc6c9"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "encoder_inputs\n",
      "tensor([[   1,    7,   17,    6,    8,   89,  157,   73,    7,  526,  246,    9,\n",
      "           14,   42,  248,  120, 1206, 1168, 8998, 4504,    4,    3],\n",
      "        [   1,  493,    6,    8, 1758, 1149, 1985, 2216, 2227,  179,   31, 4477,\n",
      "         2616,   59, 1471,    4,    3,    0,    0,    0,    0,    0]],\n",
      "       device='cuda:0')\n",
      "encoder_inputs_mask\n",
      "tensor([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n",
      "        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1]],\n",
      "       device='cuda:0')\n",
      "decoder_inputs\n",
      "tensor([[    1,     5,    16,     6,     5,    50,    41,    18,    77,     5,\n",
      "           379,   665, 17798,   106,   433,     4],\n",
      "        [    1,   409,     6,     5,  3889,   912,   834,   106,     5,   462,\n",
      "          3955,     4,     0,     0,     0,     0]], device='cuda:0')\n",
      "decoder_labels\n",
      "tensor([[    5,    16,     6,     5,    50,    41,    18,    77,     5,   379,\n",
      "           665, 17798,   106,   433,     4,     3],\n",
      "        [  409,     6,     5,  3889,   912,   834,   106,     5,   462,  3955,\n",
      "             4,     3,     0,     0,     0,     0]], device='cuda:0')\n",
      "decoder_labels_mask\n",
      "tensor([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n",
      "        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1]], device='cuda:0')\n"
     ]
    }
   ],
   "source": [
    "from functools import partial # 固定collate_fct的tokenizer参数\n",
    "\n",
    "#可以调整batch_size,来看最终的bleu\n",
    "sampler = TransformerBatchSampler(train_ds, batch_size=256, shuffle_batch=True)\n",
    "# https://pytorch.org/docs/stable/data.html#torch.utils.data.DataLoader\n",
    "sample_dl = DataLoader(train_ds, batch_sampler=sampler, collate_fn=partial(collate_fct, tokenizer=tokenizer)) #partial函数，固定collate_fct的tokenizer参数\n",
    "\n",
    "for batch in sample_dl:\n",
    "    for key, value in batch.items():\n",
    "        print(key)\n",
    "        print(value)\n",
    "    break"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "0AadtoM3N4yC"
   },
   "source": [
    "## 定义模型\n",
    "\n",
    "- Transformer模型由Embedding、Transformer-Block组成\n",
    "- Embedding包括：\n",
    "    - WordEmbedding\n",
    "    - PositionEmbedding\n",
    "- Transformer-Block包括：\n",
    "    - Self-Attention\n",
    "    - Cross-Attention\n",
    "    - MLP"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "VTl-sSJmN4yD"
   },
   "source": [
    "### Embedding"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:24.109021500Z",
     "start_time": "2024-08-05T08:06:24.106022800Z"
    },
    "ExecutionIndicator": {
     "show": true
    },
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 455
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T01:56:07.022883Z",
     "iopub.status.busy": "2025-02-07T01:56:07.022595Z",
     "iopub.status.idle": "2025-02-07T01:56:07.245697Z",
     "shell.execute_reply": "2025-02-07T01:56:07.245061Z",
     "shell.execute_reply.started": "2025-02-07T01:56:07.022851Z"
    },
    "id": "y66CxrsBN4yD",
    "outputId": "c703025c-afc5-4012-d8e3-0e9d4ad253ec",
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "image/png": "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dVISv4Z43aR2NNrJyxtvvIGsrCxMmzYN69atQ48ePTB48OCTdvdryKxatQoTJkzA6tWrsWzZMlRUVOCiiy5CcXGxqjN58mS8//77ePPNN7Fq1Srs2bMHV111VRBHXbd88803eOGFF9C9e3dTeWO87sOHD+Pcc8+Fw+HAxx9/jJ9//hn//Oc/ERcXp+pUJyV9Q+PRRx/F888/j2effRYbN27Eo48+isceewzPPPOMqtMYrru4uBg9evTA3LlzfR6vzjWOHDkSGzZswLJly/DBBx/giy++wPjx48/UJQREVdddUlKCdevW4YEHHsC6devw9ttvY9OmTbj88stN9RridZNaUqNMSA2Ifv36GRMmTFA/ezweIzU11Zg1a1YQR3V62bdvnwHAWLVqlWEYhpGfn284HA7jzTffVHU2btxoADCys7ODNcw648iRI0b79u2NZcuWGX/84x+NO+64wzCMxnvd9957rzFgwAC/x71er5GcnGw8/vjjqiw/P99wuVzGv//97zMxxNPC0KFDjb/85S+msquuusoYOXKkYRiN87oBGO+88476uTrX+PPPPxsAjG+++UbV+fjjjw2LxWLs3r37jI29Npx43b5Yu3atAcDYsWOHYRiN47pJzWmUKy/l5eXIyckxpea2Wq3IzMxEdnZ2EEd2ejm+WVB8fDwAICcnBxUVFab70KlTJ7Rs2bJR3IcJEyZg6NChpusDGu91v/fee+jbty+uvvpqNG3aFL169cJLL72kjp8qJX1DpX///li+fDl+/fVXAMD333+PL7/8EhdffDGAxnvdOtW5xuzsbMTGxqJv376qTmZmJqxWK9asWXPGx3y6KCgogMViQWxsLIDQuW5ipt7vsBsIBw4cgMfjOWkX3qSkJPzyyy9BGtXpxev1YtKkSTj33HPRtWtXAEBubi6cTqf6JT9OUlIScnNzgzDKumPx4sVYt24dvvnmm5OONdbr/u233/D8888jKysLf/vb3/DNN9/g9ttvh9PpxOjRo9W1+frcN+Trvu+++1BYWIhOnTrBZrPB4/HgoYcewsiRIwGg0V63TnWuMTc3F02bNjUdt9vtiI+PbzT3obS0FPfeey+uu+46lZgxFK6bnEyjnLyEIhMmTMBPP/2EL7/8MthDOe3s2rULd9xxB5YtW3bGs7IGE6/Xi759++Lhhx8GcGy77p9++gnz5s3D6NGjgzy608d//vMfvP7661i0aBHOOussrF+/HpMmTUJqamqjvm5ipqKiAtdccw0Mw8Dzzz8f7OGQINMoHxs1adIENpvtJHdJXl5ejdNuNwQmTpyIDz74AJ9//jmaN2+uypOTk1FeXo78/HxT/YZ+H3JycrBv3z707t0bdrsddrsdq1atwpw5c2C325GUlNQorzslJQVdunQxlXXu3Bk7d+4EYE5Jr9PQr/vuu+/GfffdhxEjRqBbt27485//jMmTJ2PWrFkAGu9161TnGpOTk08yJFRWVuLQoUMN/j4cn7js2LEDy5YtU6suQOO+buKfRjl5cTqd6NOnD5YvX67KvF4vli9fjoyMjCCOrG4xDAMTJ07EO++8gxUrVqB169am43369IHD4TDdh02bNmHnzp0N+j4MGjQIP/74o8pyun79evTt2xcjR45UujFe97nnnnuSFf7XX39Fq1atAJhT0h/neEr6hnzdJSUlsFrNf6psNhu8Xi+AxnvdOtW5xoyMDOTn5yMnJ0fVWbFiBbxeL9LT08/4mOuK4xOXzZs347PPPkNCQoLpeGO9bnIKgh0xfLpYvHix4XK5jFdeecX4+eefjfHjxxuxsbFGbm5usIdWZ9xyyy1GTEyMsXLlSmPv3r3qVVJSourcfPPNRsuWLY0VK1YY3377rZGRkWFkZGQEcdSnB91tZBiN87rXrl1r2O1246GHHjI2b95svP7660Z4eLjxr3/9S9V55JFHjNjYWOPdd981fvjhB+OKK64wWrdubRw9ejSII68do0ePNpo1a2Z88MEHxrZt24y3337baNKkiXHPPfeoOo3huo8cOWJ89913xnfffWcAMJ588knju+++U66a6lzjkCFDjF69ehlr1qwxvvzyS6N9+/bGddddF6xLqhZVXXd5eblx+eWXG82bNzfWr19v+jtXVlam+miI101qR6OdvBiGYTzzzDNGy5YtDafTafTr189YvXp1sIdUpwDw+Vq4cKGqc/ToUePWW2814uLijPDwcOPKK6809u7dG7xBnyZOnLw01ut+//33ja5duxoul8vo1KmT8eKLL5qOe71e44EHHjCSkpIMl8tlDBo0yNi0aVOQRls3FBYWGnfccYfRsmVLw+12G23atDH+/ve/m/7zagzX/fnnn/v8fR49erRhGNW7xoMHDxrXXXedERkZaURHRxtjxowxjhw5EoSrqT5VXfe2bdv8/p37/PPPVR8N8bpJ7bAYhrZNJSGEEEJIPadRxrwQQgghpPHCyQshhBBCGhScvBBCCCGkQcHJCyGEEEIaFJy8EEIIIaRBwckLIYQQQhoUnLwQQgghpEHByQshpFps374dFosF69evD/ZQCCEhDicvhDQQbrzxRlgsFlgsFjgcDiQlJeHCCy/EggULVJ6fujzXsGHD6rRPQgipKzh5IaQBMWTIEOzduxfbt2/Hxx9/jAsuuAB33HEHLr30UlRWVgZ7eIQQckbg5IWQBoTL5UJycjKaNWuG3r17429/+xveffddfPzxx3jllVcAAPn5+bjpppuQmJiI6OhoDBw4EN9//73qY/r06ejZsydeeOEFtGjRAuHh4bjmmmtQUFCgjr/66qt499131UrPypUrVfvffvsNF1xwAcLDw9GjRw9kZ2efyVtACCGcvBDS0Bk4cCB69OiBt99+GwBw9dVXY9++ffj444+Rk5OD3r17Y9CgQTh06JBqs2XLFvznP//B+++/j6VLl+K7777DrbfeCgC46667cM0116hVnr1796J///6q7d///nfcddddWL9+PTp06IDrrruOqz6EkDMKJy+ENAI6deqE7du348svv8TatWvx5ptvom/fvmjfvj2eeOIJxMbG4q233lL1S0tL8dprr6Fnz54477zz8Mwzz2Dx4sXIzc1FZGQkwsLC1CpPcnIynE6nanvXXXdh6NCh6NChA2bMmIEdO3Zgy5YtwbhsQkiIwskLIY0AwzBgsVjw/fffo6ioCAkJCYiMjFSvbdu2YevWrap+y5Yt0axZM/VzRkYGvF4vNm3adMpzde/eXemUlBQAwL59++rwagghpGrswR4AIaT2bNy4Ea1bt0ZRURFSUlJMMSrHiY2NrZNzORwOpS0WCwDUuduJEEKqgpMXQho4K1aswI8//ojJkyejefPmyM3Nhd1uR1pamt82O3fuxJ49e5CamgoAWL16NaxWKzp27AgAcDqd8Hg8Z2L4hBBSYzh5IaQBUVZWhtzcXHg8HuTl5WHp0qWYNWsWLr30UowaNQpWqxUZGRkYNmwYHnvsMXTo0AF79uzBhx9+iCuvvBJ9+/YFALjdbowePRpPPPEECgsLcfvtt+Oaa65BcnIyACAtLQ2ffPIJNm3ahISEBMTExATzsgkhxAQnL4Q0IJYuXYqUlBTY7XbExcWhR48emDNnDkaPHg2r9VgI20cffYS///3vGDNmDPbv34/k5GScd955SEpKUv20a9cOV111FS655BIcOnQIl156KZ577jl1fNy4cVi5ciX69u2LoqIifP7551Wu5BBCyJnEYhiGEexBEELOHNOnT8eSJUu4zT8hpMFCtxEhhBBCGhScvBBCCCGkQcHHRoQQQghpUHDlhRBCCCENCk5eCCGEENKg4OSFEEIIIQ0KTl4IIYQQ0qDg5IUQQgghDQpOXgghhBDSoODkhRBCCCENCk5eCCGEENKg4OSFEEIIIQ2K/wcnumZWHU5nbgAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "\n",
    "class TransformerEmbedding(nn.Module):\n",
    "    def __init__(self, config):\n",
    "        super().__init__()\n",
    "        # hyper params\n",
    "        self.vocab_size = config[\"vocab_size\"]\n",
    "        self.hidden_size = config[\"d_model\"] # 词向量维度\n",
    "        self.pad_idx = config[\"pad_idx\"]\n",
    "        dropout_rate = config[\"dropout\"]\n",
    "        self.max_length = config[\"max_length\"]\n",
    "\n",
    "        # layers,设置padding_idx可以让pad的词向量全为0\n",
    "        self.word_embedding = nn.Embedding(\n",
    "            self.vocab_size, self.hidden_size, padding_idx=self.pad_idx\n",
    "        )\n",
    "        self.pos_embedding = nn.Embedding(\n",
    "            self.max_length,\n",
    "            self.hidden_size,\n",
    "            _weight=self.get_positional_encoding(\n",
    "                self.max_length, self.hidden_size\n",
    "            ),# 位置编码，权重通过get_positional_encoding函数计算得到\n",
    "        )\n",
    "        self.pos_embedding.weight.requires_grad_(False) # 不更新位置编码的权重\n",
    "        self.dropout = nn.Dropout(dropout_rate) # 随机失活层\n",
    "\n",
    "    def get_word_embedding_weights(self):\n",
    "        return self.word_embedding.weight\n",
    "\n",
    "    # 计算位置信息\n",
    "    @classmethod\n",
    "    def get_positional_encoding(self, max_length, hidden_size):#max_length是最大长度，hidden_size是embedding维度相等\n",
    "        # Compute the positional encodings once in log space.\n",
    "        pe = torch.zeros(max_length, hidden_size) # 初始化位置编码\n",
    "        # .unsqueeze(1) 是将这个一维张量转换为二维张量，即将其形状从 (max_length,) 变为 (max_length, 1)。这个操作在张量的维度上增加了一个维度，使其从一维变为二维，第二维的大小为 1。\n",
    "        position = torch.arange(0, max_length).unsqueeze(1) # 位置信息,从0到max_length-1\n",
    "        div_term = torch.exp(\n",
    "            torch.arange(0, hidden_size, 2)\n",
    "            * -(torch.log(torch.Tensor([10000.0])) / hidden_size)\n",
    "        )# 计算位置编码的权重,为了性能考量（是数学上的对数函数分解）\n",
    "        pe[:, 0::2] = torch.sin(position * div_term)\n",
    "        pe[:, 1::2] = torch.cos(position * div_term)\n",
    "        return pe\n",
    "\n",
    "    def forward(self, input_ids):\n",
    "        # input_ids: [batch_size, seq_len]\n",
    "        seq_len = input_ids.shape[1]\n",
    "        assert (\n",
    "            seq_len <= self.max_length\n",
    "        ), f\"input sequence length should no more than {self.max_length} but got {seq_len}\"\n",
    "\n",
    "        position_ids = torch.arange(seq_len, dtype=torch.long, device=input_ids.device)\n",
    "        position_ids = position_ids.unsqueeze(0).expand_as(input_ids)\n",
    "        # print(position_ids)\n",
    "        # embedding\n",
    "        word_embeds = self.word_embedding(input_ids) # 词嵌入\n",
    "        pos_embeds = self.pos_embedding(position_ids) # 位置编码\n",
    "        embeds = word_embeds + pos_embeds\n",
    "        embeds = self.dropout(embeds)\n",
    "\n",
    "        return embeds\n",
    "\n",
    "\n",
    "def plot_position_embedding(position_embedding):# 绘制位置编码\n",
    "    plt.pcolormesh(position_embedding) # 绘制位置编码矩阵\n",
    "    plt.xlabel('Depth')\n",
    "    plt.ylabel('Position')\n",
    "    plt.colorbar() # 颜色条，-1到1的颜色范围\n",
    "    plt.show()\n",
    "\n",
    "position_embedding = TransformerEmbedding.get_positional_encoding(64, 128)\n",
    "plot_position_embedding(position_embedding)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:24.109021500Z",
     "start_time": "2024-08-05T08:06:24.107023100Z"
    },
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2025-02-07T01:56:07.246597Z",
     "iopub.status.busy": "2025-02-07T01:56:07.246351Z",
     "iopub.status.idle": "2025-02-07T01:56:07.267778Z",
     "shell.execute_reply": "2025-02-07T01:56:07.267276Z",
     "shell.execute_reply.started": "2025-02-07T01:56:07.246576Z"
    },
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([2, 50, 128])"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#随机input，调用TransformerEmbedding\n",
    "config={\n",
    "    \"vocab_size\": 100,\n",
    "    \"d_model\": 128,\n",
    "    \"pad_idx\": 0,\n",
    "    \"max_length\": 64,\n",
    "    \"dropout\": 0.1,\n",
    "}\n",
    "input_ids = torch.randint(0, 100, (2, 50))\n",
    "embeds = TransformerEmbedding(config)(input_ids)\n",
    "embeds.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "wXavO0SNN4yD"
   },
   "source": [
    "### Transformer Block"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "HZL4mu3pN4yD"
   },
   "source": [
    "#### scaled-dot-product-attention"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:24.109021500Z",
     "start_time": "2024-08-05T08:06:24.108022500Z"
    },
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 970
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T01:56:07.268597Z",
     "iopub.status.busy": "2025-02-07T01:56:07.268409Z",
     "iopub.status.idle": "2025-02-07T01:56:07.296006Z",
     "shell.execute_reply": "2025-02-07T01:56:07.295484Z",
     "shell.execute_reply.started": "2025-02-07T01:56:07.268576Z"
    },
    "id": "U9QwdVQYN4yD",
    "outputId": "b6ae9ac8-c71c-4a7b-fd4b-9c15e92dba2c"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "key_value.shape torch.Size([2, 4, 2])\n",
      "torch.Size([2, 3, 2])\n",
      "torch.Size([2, 2, 3, 4])\n"
     ]
    }
   ],
   "source": [
    "from dataclasses import dataclass\n",
    "from typing import Optional, Tuple\n",
    "\n",
    "Tensor = torch.Tensor\n",
    "\n",
    "@dataclass\n",
    "class AttentionOutput:\n",
    "    hidden_states: Tensor\n",
    "    attn_scores: Tensor\n",
    "\n",
    "class MultiHeadAttention(nn.Module):\n",
    "    def __init__(self, config):\n",
    "        super().__init__()\n",
    "        # hyper params\n",
    "        self.hidden_size = config[\"d_model\"] # 隐藏层大小\n",
    "        self.num_heads = config[\"num_heads\"] # 多头注意力的头数\n",
    "        assert (\n",
    "            self.hidden_size % self.num_heads == 0\n",
    "        ), \"Hidden size must be divisible by num_heads but got {} and {}\".format(\n",
    "            self.hidden_size, self.num_heads\n",
    "        )\n",
    "        self.head_dim = self.hidden_size // self.num_heads # 每个头的维度\n",
    "\n",
    "        # layers\n",
    "        self.Wq = nn.Linear(self.hidden_size, self.hidden_size, bias=False) #第二个self.hidden_size可以*系数\n",
    "        self.Wk = nn.Linear(self.hidden_size, self.hidden_size, bias=False)\n",
    "        self.Wv = nn.Linear(self.hidden_size, self.hidden_size, bias=False)\n",
    "        self.Wo = nn.Linear(self.hidden_size, self.hidden_size, bias=False) # 输出层\n",
    "\n",
    "    def _split_heads(self, x: Tensor) -> Tensor:\n",
    "        bs, seq_len, _ = x.shape #假设输入的维度是[batch_size, seq_len, hidden_size],hidden_size是512\n",
    "        x = x.view(bs, seq_len, self.num_heads, self.head_dim) #num_heads是8，head_dim是64\n",
    "        return x.permute(0, 2, 1, 3) #变换维度，[batch_size, num_heads, seq_len, head_dim]\n",
    "\n",
    "    def _merge_heads(self, x: Tensor) -> Tensor:#将多头注意力的输出合并为一个张量\n",
    "        bs, _, seq_len, _ = x.shape #假设输入的维度是[batch_size, num_heads, seq_len, head_dim]\n",
    "        return x.permute(0, 2, 1, 3).reshape(bs, seq_len, self.hidden_size) # 变换维度，变为[batch_size, seq_len, hidden_size]\n",
    "\n",
    "    def forward(self, querys, keys, values, attn_mask=None) -> AttentionOutput:\n",
    "        # split heads\n",
    "        querys = self._split_heads(self.Wq(querys)) #(batch_size, seq_len,hidden_dim)-->[batch_size, num_heads, seq_len, head_dim]\n",
    "        keys = self._split_heads(self.Wk(keys))#[batch_size, num_heads, seq_len, head_dim]\n",
    "        values = self._split_heads(self.Wv(values))#[batch_size, num_heads, seq_len, head_dim]\n",
    "\n",
    "        # calculate attention scores\n",
    "        qk_logits = torch.matmul(querys, keys.mT) # 计算注意力分数，matmul是矩阵乘法，mT是矩阵转置,qk_logits是[batch_size, num_heads, seq_len, seq_len]\n",
    "        # print(querys.shape[-2], keys.shape[-2])  #3 4\n",
    "        if attn_mask is not None:\n",
    "            attn_mask = attn_mask[:, :, : querys.shape[-2], : keys.shape[-2]]\n",
    "            qk_logits += attn_mask * -1e9 # 给需要mask的地方设置一个负无穷\n",
    "        attn_scores = F.softmax(qk_logits / (self.head_dim**0.5), dim=-1) # 计算注意力分数\n",
    "\n",
    "        # apply attention scores\n",
    "        embeds = torch.matmul(attn_scores, values) # softmax后的结果与value相乘，得到新的表示\n",
    "        embeds = self.Wo(self._merge_heads(embeds)) # 输出层 [batch_size, seq_len, hidden_size]\n",
    "\n",
    "        return AttentionOutput(hidden_states=embeds, attn_scores=attn_scores)\n",
    "\n",
    "mha = MultiHeadAttention({\"num_heads\": 2, \"d_model\": 2})\n",
    "query = torch.randn(2, 3, 2) # [batch_size, seq_len, hidden_size]\n",
    "query /= query.norm(dim=-1, keepdim=True) # 归一化\n",
    "key_value = torch.randn(2, 4, 2)\n",
    "print(f'key_value.shape {key_value.shape}')\n",
    "outputs = mha(query, key_value, key_value) #最终输出shape和query的shape一样\n",
    "print(outputs.hidden_states.shape)\n",
    "print(outputs.attn_scores.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:24.816743500Z",
     "start_time": "2024-08-05T08:06:24.108022500Z"
    },
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2025-02-07T01:56:07.296870Z",
     "iopub.status.busy": "2025-02-07T01:56:07.296623Z",
     "iopub.status.idle": "2025-02-07T01:56:07.537741Z",
     "shell.execute_reply": "2025-02-07T01:56:07.537192Z",
     "shell.execute_reply.started": "2025-02-07T01:56:07.296849Z"
    },
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAhUAAAG6CAYAAAC/RrTYAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAoW5JREFUeJzs3Xd4FGXXwOHflvTeIARC77333pHeEZUmTUBFRH3BAlhAUEFFsAMKFkTEgtKl915TgARCCOm9J7vz/RFYWLLBAFsg37mvK9f7Ojk7e87O7JOzzzyzqBRFURBCCCGEeEhqWycghBBCiJJBmgohhBBCmIU0FUIIIYQwC2kqhBBCCGEW0lQIIYQQwiykqRBCCCGEWUhTIYQQQgizkKZCCCGEEGYhTYUQQgghzEKaCmFRY8aMoWLFisWKnTt3LiqV6j/jOnbsSN26dR8yM/OqWLEiY8aMsXUaVnM/x/VRUNxz687Y+Ph4C2dVssjrJkCaCmFlmZmZzJ07l127dtk6lUfa/Pnz+f333wttP3DgAHPnziU5OdniOURFRTF37lxOnTpl8eeyhaJeY1u6cOECc+fO5cqVK7ZORYgHIk2FsKrMzEzmzZtnsql44403yMrKsn5Sj6B7NRXz5s2zWlMxb948k03F119/TUhIiMVzMBdT59aj2lTMmzdPmgrx2NLaOgEhbtFqtWi1cko+Duzs7Gydwn2Rc0sI65CZiv+Hbl37DA0N5emnn8bDwwM/Pz/efPNNFEXh2rVr9O/fH3d3d/z9/fnoo4+MHr9q1SpUKlWhT1O7du1CpVIVeWnjypUr+Pn5ATBv3jxUKhUqlYq5c+ca5VVcFy5coFOnTjg7O1O2bFkWLVpUKCYnJ4c5c+ZQtWpVHBwcCAwM5NVXXyUnJ8cobuXKlXTu3JlSpUrh4OBA7dq1+fzzzwvtT1EU3n33XcqVK4ezszOdOnXi/Pnzxc75ww8/pHXr1vj4+ODk5ESTJk349ddfjWJUKhUZGRl89913htdozJgxzJ07l1deeQWASpUqGX5353FYs2YNTZo0wcnJCW9vb0aMGMG1a9eM9n9rTcq9Xr9du3bRrFkzAMaOHWt4rlWrVgGm11RkZGTw8ssvExgYiIODAzVq1ODDDz/k7n8IWaVSMW3aNH7//Xfq1q2Lg4MDderUYfPmzfd87RRFwdfXlxkzZhi26fV6PD090Wg0RrM3CxcuRKvVkp6eDhQ+t4p6je+UnJzMmDFj8PT0xMPDg7Fjx5KZmWkUk5+fzzvvvEOVKlVwcHCgYsWKzJ49u9D5ded5fqc71+KsWrWKoUOHAtCpUydDXve6VDhmzBhcXV2JiIigT58+uLq6UrZsWZYtWwbA2bNn6dy5My4uLlSoUIEff/zR6PGJiYnMnDmTevXq4erqiru7O7169eL06dOFnmvp0qXUqVMHZ2dnvLy8aNq0aaH93e3q1atUrVqVunXrEhMTc89YUTJIU/H/2PDhw9Hr9bz//vu0aNGCd999l48//phu3bpRtmxZFi5cSNWqVZk5cyZ79ux56Ofz8/Mz/KEeOHAgq1evZvXq1QwaNOi+95WUlETPnj1p0KABH330ETVr1uS1115j06ZNhhi9Xk+/fv348MMP6du3L0uXLmXAgAEsWbKE4cOHG+3v888/p0KFCsyePZuPPvqIwMBApkyZYhicb3nrrbd48803adCgAR988AGVK1eme/fuZGRkFCvvTz75hEaNGvH2228zf/58tFotQ4cO5e+//zbErF69GgcHB9q1a2d4jSZNmsSgQYN48sknAViyZInhd7catffee49Ro0ZRrVo1Fi9ezPTp09mxYwft27cvdLnkv16/WrVq8fbbbwMwceJEw3O1b9/eZF2KotCvXz+WLFlCz549Wbx4MTVq1OCVV14xagJu2bdvH1OmTGHEiBEsWrSI7OxsBg8eTEJCQpGvnUqlok2bNkbn4pkzZ0hJSQFg//79hu179+6lUaNGuLq6mtxXUa/xnYYNG0ZaWhoLFixg2LBhrFq1innz5hnFjB8/nrfeeovGjRuzZMkSOnTowIIFCxgxYkSRdRSlffv2vPDCCwDMnj3bkFetWrXu+TidTkevXr0IDAxk0aJFVKxYkWnTprFq1Sp69uxJ06ZNWbhwIW5ubowaNYrw8HDDY8PCwvj999/p06cPixcv5pVXXuHs2bN06NCBqKgoQ9zXX3/NCy+8QO3atfn444+ZN28eDRs25PDhw0XmdfnyZdq3b4+bmxu7du2idOnS9/2aiMeQIv7fmTNnjgIoEydONGzLz89XypUrp6hUKuX99983bE9KSlKcnJyU0aNHG7atXLlSAZTw8HCj/e7cuVMBlJ07dxq2jR49WqlQoYLhv+Pi4hRAmTNnTpF5/ZcOHToogPL9998btuXk5Cj+/v7K4MGDDdtWr16tqNVqZe/evUaP/+KLLxRA2b9/v2FbZmZmoefp0aOHUrlyZcN/x8bGKvb29krv3r0VvV5v2D579mwFMHqNinL38+Tm5ip169ZVOnfubLTdxcXF5P4++OADk6/9lStXFI1Go7z33ntG28+ePatotVqj7cV9/Y4ePaoAysqVKwvlcfdx/f333xVAeffdd43ihgwZoqhUKuXSpUuGbYBib29vtO306dMKoCxdurTQc91dv0ajUVJTUxVFUZRPP/1UqVChgtK8eXPltddeUxRFUXQ6neLp6am89NJLhseZOreKeo1vxY4bN85o+8CBAxUfHx/Df586dUoBlPHjxxvFzZw5UwGUf//916hmU+d8hQoVjHJYt25doffQvYwePVoBlPnz5xu23XrPqlQq5eeffzZsDw4OLpRHdna2otPpjPYZHh6uODg4KG+//bZhW//+/ZU6dercM5dbr1tcXJwSFBSkBAQEKM2aNVMSExOLVYsoGWSm4v+x8ePHG/6/RqOhadOmKIrCs88+a9ju6elJjRo1CAsLs0WKRXJ1deXpp582/Le9vT3Nmzc3ynPdunXUqlWLmjVrEh8fb/jp3LkzADt37jTEOjk5Gf5/SkoK8fHxdOjQgbCwMMMn4e3bt5Obm8vzzz9vNJU+ffr0Yud95/MkJSWRkpJCu3btOHHiRPGLN+G3335Dr9czbNgwo1r9/f2pVq2aUa1QvNfvfvzzzz9oNBrDJ+1bXn75ZRRFMZpBAujatStVqlQx/Hf9+vVxd3f/z+dv164dOp2OAwcOAAUzEu3ataNdu3bs3bsXgHPnzpGcnEy7du0eqJZbJk+eXOi5ExISSE1NBQpqBgrNxLz88ssARrNPlnbne/nWe9bFxYVhw4YZtteoUQNPT0+j19jBwQG1uuDPgE6nIyEhAVdXV2rUqGF0Tnp6ehIZGcnRo0f/M5dz587RoUMHKlasyPbt2/Hy8jJHieIxIU3F/2Ply5c3+m8PDw8cHR3x9fUttD0pKcmaqf2ncuXKFVp/4eXlZZTnxYsXOX/+PH5+fkY/1atXByA2NtYQu3//frp27YqLiwuenp74+fkxe/ZsAENTcfXqVQCqVatm9Lx+fn7FHjg3btxIy5YtcXR0xNvb23BJ6NZzPKiLFy+iKArVqlUrVG9QUJBRrVC81+9+XL16lYCAANzc3Iy235q6v/Xa3XL3uVfc52/cuDHOzs6GBuJWU9G+fXuOHTtGdna24Xdt27Z9oFqKyvHWMb6V49WrV1Gr1VStWtUozt/fH09Pz0I1W4qjo6PhEtgtHh4eJo/x3e9lvV7PkiVLqFatGg4ODvj6+uLn52d0WQngtddew9XVlebNm1OtWjWmTp1qdLnpTn379sXNzY0tW7bg7u5uxkrF40CWQ/8/ptFoirUNMFpsV9RiSp1OZ57EiqE4eer1eurVq8fixYtNxgYGBgIF1367dOlCzZo1Wbx4MYGBgdjb2/PPP/+wZMkS9Hq9WXLeu3cv/fr1o3379ixfvpwyZcpgZ2fHypUr/3PB23/R6/WoVCo2bdpk8rW5e21BcV4/S3rQ57ezs6NFixbs2bOHS5cuER0dTbt27ShdujR5eXkcPnyYvXv3UrNmzUJ/aC2V4/0sLr6bOd4zReVZnPznz5/Pm2++ybhx43jnnXfw9vZGrVYzffp0o/O+Vq1ahISEsHHjRjZv3sz69etZvnw5b731VqF1JoMHD+a7777jhx9+KLRORZR80lSI+3brE9vdi/+K88nsYQbg+1WlShVOnz5Nly5d7vm8f/31Fzk5Ofz5559Gn07vvmRQoUIFoGBWoHLlyobtcXFxxfqEv379ehwdHdmyZQsODg6G7StXriwUW1S+RW2vUqUKiqJQqVIlw0zMw7qfY1WhQgW2b99OWlqa0WxFcHCw4ffm0q5dOxYuXMj27dvx9fWlZs2aqFQq6tSpw969e9m7dy99+vT5z/087LlYoUIF9Ho9Fy9eNFpMGRMTQ3JyslHNXl5ehd4vubm53Lhxw6w53a9ff/2VTp068e233xptT05OLjRj6eLiwvDhwxk+fDi5ubkMGjSI9957j1mzZuHo6GiI++CDD9BqtUyZMgU3NzdGjhxplVrEo0Euf4j7duta+J2r8HU6HV999dV/PtbZ2Rko3JBYwrBhw7h+/Tpff/11od9lZWUZ7ti49Ynuzk9wKSkphf7Yd+3aFTs7O5YuXWoU+/HHHxcrH41Gg0qlMvp0euXKFZNfwOTi4mLyNXJxcQEKv36DBg1Co9Ewb968Qp+kFUW5510VRSnquUx54okn0Ol0fPbZZ0bblyxZgkqlolevXvf9/EVp164dOTk5fPzxx7Rt29bwh/jWnRxRUVHFWk9R1GtcXE888QRQ+Pjfmhnr3bu3YVuVKlUK3UH11VdfFZqpuJ/X3Bw0Gk2h82XdunVcv37daNvd54+9vT21a9dGURTy8vKMfqdSqfjqq68YMmQIo0eP5s8//7RM8uKRJDMV4r7VqVOHli1bMmvWLBITE/H29ubnn38mPz//Px/r5ORE7dq1Wbt2LdWrV8fb25u6deta5N/yeOaZZ/jll1+YPHkyO3fupE2bNuh0OoKDg/nll1/YsmULTZs2pXv37tjb29O3b18mTZpEeno6X3/9NaVKlTL6JOnn58fMmTNZsGABffr04YknnuDkyZNs2rSp0Kc6U3r37s3ixYvp2bMnI0eOJDY2lmXLllG1alXOnDljFNukSRO2b9/O4sWLCQgIoFKlSrRo0YImTZoA8PrrrzNixAjs7Ozo27cvVapU4d1332XWrFlcuXKFAQMG4ObmRnh4OBs2bGDixInMnDnzvl6/KlWq4OnpyRdffIGbmxsuLi60aNGCSpUqFYrt27cvnTp14vXXX+fKlSs0aNCArVu38scffzB9+nSjRZkPq1WrVmi1WkJCQpg4caJhe/v27Q23LBenqSjqNS6uBg0aMHr0aL766iuSk5Pp0KEDR44c4bvvvmPAgAF06tTJEDt+/HgmT57M4MGD6datG6dPn2bLli2FzpuGDRui0WhYuHAhKSkpODg4GL4/xRL69OnD22+/zdixY2ndujVnz57lhx9+MJqJA+jevTv+/v60adOG0qVLExQUxGeffUbv3r0LraMBUKvVrFmzhgEDBjBs2DD++ecfwwJpUcJZ/4YTYWt33vp1p9GjRysuLi6F4jt06FDodrLLly8rXbt2VRwcHJTSpUsrs2fPVrZt2/aft5QqiqIcOHBAadKkiWJvb290i9v93FJq6vY2U8+Vm5urLFy4UKlTp47i4OCgeHl5KU2aNFHmzZunpKSkGOL+/PNPpX79+oqjo6NSsWJFZeHChcqKFSsK3b6p0+mUefPmKWXKlFGcnJyUjh07KufOnSt0a2BRvv32W6VatWqKg4ODUrNmTWXlypUm6w4ODlbat2+vODk5Fbpd9Z133lHKli2rqNXqQvmtX79eadu2reLi4qK4uLgoNWvWVKZOnaqEhIQ80Ov3xx9/KLVr11a0Wq3R7aWmYtPS0pSXXnpJCQgIUOzs7JRq1aopH3zwgdHtt4pScHvl1KlTCz1/cV9DRVGUZs2aKYBy+PBhw7bIyEgFUAIDAwvF389rXNT7w9St1Hl5ecq8efOUSpUqKXZ2dkpgYKAya9YsJTs72+ixOp1Oee211xRfX1/F2dlZ6dGjh3Lp0iWTNX/99ddK5cqVFY1G85+3l97Pe1ZRCl7j3r17G/47Oztbefnllw3nc5s2bZSDBw8qHTp0UDp06GCI+/LLL5X27dsrPj4+ioODg1KlShXllVdeMXoPmXrdMjMzlQ4dOiiurq7KoUOHiqxDlBwqRbHSyiwhhBBClGiypkIIIYQQZiFNhRBCCCHMQpoKIYQQQpiFNBVCCCGEMAtpKoQQQghhFtJUCCGEEMIspKkQQgghhFlIUyGEEEIIs5CmQgghhBBmIU2FEEIIIcyiRDcVy5Yto2LFijg6OtKiRQuOHDli65TMZs+ePfTt25eAgABUKpXJf+nycbVgwQKaNWuGm5sbpUqVYsCAAYSEhNg6LbP5/PPPqV+/Pu7u7ri7u9OqVSs2bdpk67TEHUrq2FGSxw2QseNRUGKbirVr1zJjxgzmzJnDiRMnaNCgAT169CA2NtbWqZlFRkYGDRo0YNmyZbZOxex2797N1KlTOXToENu2bSMvL4/u3bsb/qnyx125cuV4//33OX78OMeOHaNz587079+f8+fP2zo1QckeO0ryuAEydjwSbP0vmllK8+bNjf4lRJ1OpwQEBCgLFiywYVaWASgbNmywdRoWExsbqwDK7t27bZ2KxXh5eSnffPONrdMQyv+fsaOkjxuKImOHLZTImYrc3FyOHz9O165dDdvUajVdu3bl4MGDNsxMPIiUlBQAvL29bZyJ+el0On7++WcyMjJo1aqVrdP5f0/GjpJFxg7r09o6AUuIj49Hp9NRunRpo+2lS5cmODjYRlmJB6HX65k+fTpt2rShbt26tk7HbM6ePUurVq3Izs7G1dWVDRs2ULt2bVun9f+ejB0lh4wdtlEimwpRckydOpVz586xb98+W6diVjVq1ODUqVOkpKTw66+/Mnr0aHbv3v1IDQ5CPM5k7LCNEtlU+Pr6otFoiImJMdoeExODv7+/jbIS92vatGls3LiRPXv2UK5cOVunY1b29vZUrVoVgCZNmnD06FE++eQTvvzySxtn9v+bjB0lg4wdtlMi11TY29vTpEkTduzYYdim1+vZsWPHI3XtSZimKArTpk1jw4YN/Pvvv1SqVMnWKVmcXq8nJyfH1mn8vydjx+NNxg7bK5EzFQAzZsxg9OjRNG3alObNm/Pxxx+TkZHB2LFjbZ2aWaSnp3Pp0iXDf4eHh3Pq1Cm8vb0pX768DTN7eFOnTuXHH3/kjz/+wM3NjejoaAA8PDxwcnKycXYPb9asWfTq1Yvy5cuTlpbGjz/+yK5du9iyZYutUxOU7LGjJI8bIGPHI8HWt59Y0tKlS5Xy5csr9vb2SvPmzZVDhw7ZOiWz2blzpwIU+hk9erStU3topuoClJUrV9o6NbMYN26cUqFCBcXe3l7x8/NTunTpomzdutXWaYk7lNSxoySPG4oiY8ejQKUoimLNJkYIIYQQJVOJXFMhhBBCCOuTpkIIIYQQZiFNhRBCCCHMQpoKIYQQQpiFNBVCCCGEMAtpKoQQQghhFtJUCCGEEMIsSnxTkZOTw9y5cx+przE1J6nv8VbS63tclfTjIvU93h7l+kr8l1+lpqbi4eFBSkoK7u7utk7H7KS+x1tJr+9xVdKPi9T3eHuU6yvxMxVCCCGEsA5pKoQQQghhFlb/V0r1ej1RUVG4ubmhUqks/nypqalG/1vSSH2PN2vXpygKaWlpBAQEoFY/Pp8pZNwwL6nv8fYojxtWX1MRGRlJYGCgNZ9SCHGXa9euUa5cOVunUWwybghhe8UZN6w+U+Hm5gZA496vo7FztPbTW8WNDiV67SvY6W2dgUV5nbCzdQoWo8vN5sKadwzvw8fFrXxbdPgfWm3JHDccI0vmp+pbFDuNrVOwqPwFGbZOwWLyM3M5MPybYo0bVm8qbk1dauwc0ZbQpkLtJE3F40xjX3KbiluscQnBnG7lq9U6ltimQqt59G4PNCdFU7KbClzybZ2BxRVn3Hh8LqoKIYQQ4pEmTYUQQgghzEKaCiGEEEKYhTQVQgghhDALaSqEEEIIYRbSVAghhBDCLKSpEEIIIYRZSFMhhBBCCLOQpkIIIYQQZiFNhRBCCCHMQpoKIYQQQpiFNBVCCCGEMAtpKoQQQghhFtJUCCGEEMIspKkQQgghhFlIUyGEEEIIs5CmQgghhBBmIU2FEEIIIcxCmgohhBBCmIXW1gncr0E9GvJU32Z4e7pw6Woci1fsIOhytMnYfl3q0bN9HSoH+gIQEhbDFz/tNcRrNGomjWhLq0aVCCjlSXpmDsfOXuXzH/cQn5RhtZruNKpOIyY2aIafkwtBCbHM2b+D03Gm6xtRsz6Dq9ehhndBfWfjYlh0ZI9R/NVJr5h87PxDu/jy9FHzF/AfRtVqxMS6LQrqS4plzsHtnI6/YTJ2RPUGDK5ahxpefgCcTYhm0bE9RvHOWjv+17QD3StUx8vBkWtpKay8cJwfQk5Zo5xChnVowOhuTfFxdyE0Mo6Fa3dy/qrp4zewTT36tKxF1YCC4xcUEcPS3/cbxU/q3YoeTWvg7+VGnk5HUEQMn/2xn3NXTO9TFG1A30aMGNICby8XLoXF8uny7QSHmj73evdsQI+udahUoeDcC70Uzdcr9xjFj3m6DZ071MLPz438PD2hl6L5ZtUegkJM79PS+j7ZkiFj2+Hl60pYSDTL5/9F6NlIk7E9hzSla7/GVKhaGoBLF66z8pOthniNVs3oF7rRrF0NypTzJiM9m5MHL7FiyRYS49KsVtOd+g5vzpDRbfH2cSUsNJrlC/8m5Nx1k7G9BjWha5+Gd9QXxcrPthniNVo1Y6Z2pVnb6pQp50VGWjYnD4fx7adbbVZf/7JtGBbYCW97Ny5nRLE0dAMhaREmY9v61mNkha6UdfJFo1ZzPTOeddd2sT3muCFmVMUedCrVED9HT/L1OkLTIlkR/g/Bqab3aS4PNFOxbNkyKlasiKOjIy1atODIkSPmzsukLq1q8MKojqz49SBjX1vNpauxLHl9CF7uzibjG9UOZPv+YJ6ft5ZJb/xIbEIaH78xBF8vVwAc7bVUr1SKlesPMfa175n90R+UD/Bm4asDrVLP3fpUqcEbrTryyfED9Fn/PUGJcazuPRQfR9P1tQoI5M9LQYz4ay0Df/+BqIxUVvceSmlnV0NM0++XG/3M3LUJvaLwT1iotcoy6FOpJm8078wnp/bT589VBCXGsrrHsKLrKxPIn2FBjNj0EwM3riYqPY3VPYYZ1fdmi850KFeZ6bv/ostv3/DthWO83aobXQOrWqssg+5NqvPy4A58+fchRs5fQ2hkHMtfGISXm5PJ+KbVy7H5aAgTlqxj9KKfiE5M4/MXBuHncbu+q7FJLFz7L0Pf/Z6xH64lKiGV5S8MxsvV9D4fdbYaOzq1r8mUCZ1ZtWY/E6at4nJYLB+8NwxPD9PnXsP6gezYFcRLr/3E1JdWExuXxofzh+Hrc/vYXItM5JPl2xg3eQXPz/yB6JgUPpg/HA8P6x+b9j3rMeHVJ1izfAfThi4jLOQG7305Fg9vF5Px9ZtVZtc/p3lt3De89NQXxEWnMP+rsfiUcgfAwdGOqrUC+PGLnUwb+hnvvPgD5Sr5MfezZ6xZlkGH7nWZ+HIvfvhyJ1Of/Jyw0GjeWz4aD68i6mtaiZ2bz/LqhBW8NOor4mJSmP/5aHxKuQG36ivDj1/vYuqIz3n75Z8oV9GHeR8/Zc2yDDqWasjkqv35/soWJh9bzOX0KBY2mIinnavJ+LT8TH64up3nT3zChCMfsiX6CK/WHEFT7xqGmMjMOJZe/I0JRz7gxRNLiclOZGGDSXjYmX7NzOW+m4q1a9cyY8YM5syZw4kTJ2jQoAE9evQgNjbWEvkZGdGnKX/uOMvfu85x5XoCi77eRk5uHn061TUZP2/pP/y29RQXr8ZxNSqRBV9sQa1S0bReeQAysnKZ/u6v/HswhIgbSZy/eIPFK3ZQq4o/pX3cLF7P3cbXa8rPQWdYF3KOi8kJzN6zlaz8PIbVNF3fi//+zeoLp7iQEMvl5ERe211QX5uyFQwxcVkZRj/dKlTlYFQE19JSrFWWwfi6zfg55DTrLp4tqG//loL6qtczGf/i7o2sDj7JhcRYLqck8tr+TQX1Bdyur0mpsqy/eI5D0deITE/lp5DTBCXG0tCvjLXKMni6SxN+23+OPw+eJyw6kfd+2k52bj4DWpk+fq+v3MS6PacJjYzjSkwSb6/ZhkqlokXNQEPM5qPBHA6O4Hp8CmE3Evjo1924OTlQrayvtcoyG1uOHUMHNePvzafZvO0sVyMSWLx0C9k5eTzRw/S5996ijfyx8SSXwmKJiEzkg483oVKpaNzw9rm3Y1cQx09e5UZ0CleuxrPsq39xdXGgSqVSFq/nboNGt2Xzr0fZ9vsJIi7HsnTeH+Rk59JjUBOT8Yte+4WNPx8mLPgGkeFxfPzWb6jUKhq2rAJAZnoOsyesZO+Ws0ReiSf4zDWWv/cn1euWw6+MhzVLA2DQM63Z/Nsxtv5xkoiwOD599y9ysvPoMaCxyfiFs39l4y9HCAuJ5tqVeJbM+x2VSkWj5rfrmzX5O/ZsPUfk1XiCz0ay7P2/qV6nLH7+1q9vSGAH/ok6xJboo1zNjOHjkF/J0efRs0xzk/Gnky+zP/4sEZmx3MhO4LfIvYRl3KCuRyVDzL+xJziRdJEb2YlczYzh80t/4Kp1orJrgEVrue+mYvHixUyYMIGxY8dSu3ZtvvjiC5ydnVmxYoUl8jPQatTUqFyaY2evGrYpChw9G0Hd6sV7kRwdtGi1alLTs4uMcXG2R69XSMvMeeic74edWk09P3/2Xb+jPmBf5FUaly5efU5aLXZqNck5WSZ/7+vkTOfylVkbfNYcKd8XO7Waej7+7Iu6q76oKzT2K1usfThp7G7Wd/v4HY+9TtfyVQ2zF638y1PJw4s918PNmv9/0WrU1CpfmsPBxufn4eCr1K9cvAbH0V6LVqMhJcP0+anVqBnUth5pmdmERsaZJW9rstnYoVVTo5o/x08aH5vjJ69Qu1bxzj0HBzu0WjVpaUUcG62avr0akp6ezeUwyzdJRs9tp6Fa7QBOHrxk2KYoCicPXaZWg/LF2oeDox1arYa0lMwiY1xcHdHr9WSkFj1+WoJWq6FarQBOHA4zbFMUhZOHL1O7fuA9Hnlb8epzKKiviGNsKVqVhuqu5TiRdHv2WEHhRGIotd0rFmsfjbyqUc7Zj7PJYSZ/r1Vp6B3QivS8LC6nR5kj7SLd15qK3Nxcjh8/zqxZswzb1Go1Xbt25eDBg2ZP7k6e7k5oNWoSk43XOiQmZ1AhwLtY+5jyVAfiEzOMGpM72dtpmPJUe7btDyIzK/ehc74fXo5OaNVq4rOMT/r4rEyqeBavvlktOhCTkcH+66brG1y9Lhl5uWwOt/6lDy8H55v1GR+/gvp8irWPWc06EJOZzv6oK4Ztcw5uZ0GbHhwZMZU8vQ69ovC//Zs5EmP6WrKleLnePD9TjY9fQmomFUsX7/i9OLAdcSnpHA42vubZrm4l3n+2N472dsSnZjD50/UkF9F4PKpsOXZ4uDujMTF2JCVnUj6weOfepHEdiE9I5/jJK0bbWzWvwluz+uHgYEdCYjovz15LSqrppt5S3D2d0Wg1JCekG21PTkgnsJJfsfYx7uWeJMSmcvLgZZO/t7PXMm5GT3b9c4bMDOt+4HL3Ml1fUkI6gRWLN2P37PTuJMSlGTUmd7Kz1/Lsi93Ztfms1evzsHNBo9aQlGu8liMpL41Al6JnvVw0jqxtPQc7tRa9oueT0PUcTzIe21v61OaN2s/goLEjMTeNV09/QWqeZdcL3ldTER8fj06no3Tp0kbbS5cuTXBwsMnH5OTkkJNz+yClpqY+QJoP75n+zenapgZT564lN09X6PcajZp3XuqLChUffLPdBhk+nOcaNqdvlZoM/2stObrC9QEMq1GX3y8FFfn7R9lz9VvQt3Ithv/zk1H+Y2o3oVGpAMZt+5Xr6am08A/knVbdbjYfppurR9HY7s3o0bQmE5b8Qm6+8fE5GnqNEfPX4OnqxKA29Vg0vg/PLPqRpDTr/vF6GPc7djwq4wbAyGEt6NyxFtNf/anQ2HHydATjp6zEw8OZ3r0aMHd2f557cTXJ9/hE/KgZNr49HXvV59Ux35CXm1/o9xqtmtcXP4lKBZ+9/YcNMnw4w8a2o2OPerwyfkXR9S0aDioVS9/7ywYZPphMXQ4Tj32Ek8aexl7VeK5qf25kJ3A6+XZjeCrpEhOPfYSHnQu9y7TkzTqjmHb8E5Lz0u+x54dj8VtKFyxYgIeHh+EnMLB401V3S07NIl+nx9vTeJGJt6dLoU8gd3uyb1OeHtCc6e/+yuWI+EK/12jUvPtSX/x93Xnx3XVWn6UASMrOIl+vx9fJeOGYr5MzcVn3rm9i/WY817AFT/+9juBE09PizfzLUtXLh5+Dzpgt5/uRlJN5sz7j4+fr5Exc5n/UV7c5z9VrydObfyE46XZ9DhotrzRpz7uH/2XHtcsEJ8XxXdAJNoYFM7Gu6WuRlpKUfvP8vGvRsI+7Mwmp967vma5NGNujGVM+Xc/F64XPz+zcfK7FJXM2/Abz1mxFp9czsLXpdRolhbnGDYCU1Ex0JsYOL09nEv/jLq/hg5szclhLXpn9C2Hhhd9b2Tl5XL+RzIXgKD5YsgmdTs8TPes/cK4PIjU5E12+Dk8f40V9nj6uJMXf+06GwWPaMuzZDsyesJLw0MJ3FGm0amZ/9CSlAjyZNX6F1T/FA6Qmma7Py8eVpPh7/3EcMqoNw8e1Y9Zz3xF+MabQ7281FKXLeDJr8iqb1JeSl4FOr8PL3ngdn5edG4k5RR8/BYWorHgup0ex7tpu9sSd5skKXYxisvW5RGXFE5R6lQ9D1qJT9PQq08IiddxyX02Fr68vGo2GmBjjgxMTE4O/v7/Jx8yaNYuUlBTDz7Vr1x4o0XydnpCwGJrUvX2NUKWCpnXLcy606GtET/VrxtjBrZgxfz3BYSZOqpsNRaC/Fy++s+6e6y0sKU+v52xctNEiSxXQpmwFTsQUXd+kBs15vnErRv/zK2fjC9d3y/Ca9TkTF01QEU2HpeXp9ZxNiDZaZKkC2gRU5ESc6dvCACbVa87zDVszeus6ziYYD3p2ajX2Gg36ux6jUxTUKpUZs/9v+To9QRExtKhhfH42r1GeM2FF32I4ultTJjzRkqmfbeBCRNHH704qlQo77eN1N/j9jh3mGjcA8vP1hFyMNlpkqVJBk4YVuRBU9Lk3YkhznhnZmlffWEfIxeLdwqtSqbC30zxwrg8iP0/HxQtRNGx5+44nlUpFwxZVCDpd9O2DQ8a1Y+TkzrwxaRUXzxd+HW41FGUr+DLr2RWkpdhmZiw/X8fFoCgaNa9s2KZSqWjYvDIXzhR9Xgwd05aREzry+pTvuXih8Bh6q6EoW96H/01eabv6FB2h6ZE08qpm2KZCRSOvalxIvVLs/ahUKuxU9x4X1CoVdmrLjh331VTY29vTpEkTduzYYdim1+vZsWMHrVq1MvkYBwcH3N3djX4e1M8bj9GvS316dahDhbLevDK+G44OdmzcdQ6AN6f2YvKT7QzxT/dvzoThbZj/+WZuxKbg7eGMt4czTg52QEFDMX9GP2pWLs3cpX+jVqsMMVqN9b8X7JuzxwzfPVHV05v32nXH2c6OdSEF9S3u9ASvNr9d3+QGzXm5WRte3b2ZyLRU/Jxc8HNywVlrZ7RfVzt7eleubrNZilu+OXf05ndP1KWqhw/vte6Bs9aOdaEFC0cXt+/Nq03aG+In12vBy43b8eref4hMTylUX3peLgdvRDC7WUda+gcS6OrBkKp1GVy1DluuWn/dyJodxxnYth59W9amkr83s5/sipODHX8cPA/AO6N78nz/tob4Md2bMaVva+at3kpUQgo+7s74uN8+Px3ttUzr34Z6lcpQxtuNWuVLMeeZ7pTydGXbCevX9zDud+ww57gBsO63o/Tp1YAeXetSPtCHl57vgaOjHZu2Fpx7s2b2ZsLY2+fek0NbMG5UOxYt/ofomBS8vVzw9nLByfHmsXGwY/yY9tSuGUDpUu5Ur1qaV1/qhZ+vG7v2hjxUrg/it+/20WtIU7r2b0RgZT+ef6s/jk72bN1wAoCZ84cwdnp3Q/zQZ9sz6vluLH5zPTFRSXj5uuLl64qjsz1Q8Af3jSUjqV6nLAtfW4taozLEaK3cNAH8tvpAwXdP9G1IYCU/nn+9b0F9fxTU98o7gxn7fDdD/LAx7Rg1pQuL524gJioZLx9XvHxccXS6Xd+bH4ygeu2yLJz9K2q12hCj1Vq/vl+v7aZ3mZZ0929KeedSTK8+BEeNPVtuFNxy/VqtJ3m2cm9D/JPlu9DEqzplHL0p71yKoYEd6Fa6KTtufk+Fo9qeZys/QS33CpRy8KKaazlm1hyOr70Hu2NPWbSW+25ZZsyYwejRo2natCnNmzfn448/JiMjg7Fjx1oiPyM7Dobg6e7MhGFt8PZ05uKVOGbM/5Wkm9cvS/u6o1cUQ/zAbg2wt9My/+X+Rvv5dt0Bvl13AD9vV9o1K+juv/9gtFHM1LlrOXnhwT8dPYiNl0PwcXRmRtM2+Dm7cCE+llH//GpYvBng6mZU39N1GuKg0fJFd+P6lhzbz8fHDxj+u2/VmqhQ8eflIOsUUoSN4cEF9TVui5+TCxcSYxm19Rfis2/W52J8/J6u2aigvi7G3xuy5OQ+Pj65H4Dnd/3Jq0068EmHvng6OBKZnsoHx/eyJviU1eq6ZevxULxcnXmuT2t83J0JiYxj6tLfSEwrqM/f2/j4DW1fH3s7LR9O7Gu0ny82HuTLvw+i1ytULO1N34l18HRxJCUjm/NXoxn30VrCbiRYtTZzsOXYsXNPMJ4ezox9pq3hy69efeMXkpJvjh2l3FHuODb9+zTC3l7L228an3ur1uxj1Zr96PV6ygd606PrADzcnUhNyyI4NJrnZ/7AlauFL2FZ2p7NZ/HwduGZaV3x8nUjLPgGb0xaaVjcWKqMp1F9fYa3wN5ey5t3fS/DmmU7WLN8B76l3GnVuTYAn//2glHMq2O+5sxR695dtXvrOTy8XBj1XJebX+51g9enfE9yYsHlK78yHuiV23OWvYc1K6jvoyeN9rP6i39Z88XOgvo61QLg81+mGsW8Mv5bzhy7YtmC7rIr9hQedq6MqdQTL3t3Lqdf539nviLp5tqHUg5eRsfPUWPPC9UH4+fgSY4+j2uZMSwI+oFdNxsGHXoCnUsxt24z3O1cSM3LICT1GtNPfsbVzOLNiD4olXJnpsX02Wef8cEHHxAdHU3Dhg359NNPadGieNdpUlNT8fDwoNmAd9DaOd53wo+D613u+yV9vNjdfcGhZPE+avffQY8pXW42Z1e8TkpKykN/+n8QDzp23Bo32nSZi1ZbMscNx2vW/+4Ya1JsMMNhTflLbPMtzNaQn5HDnr7LizVuPNDFlWnTpjFt2rQHSk4I8f+XjB1ClGzyD4oJIYQQwiykqRBCCCGEWUhTIYQQQgizkKZCCCGEEGYhTYUQQgghzEKaCiGEEEKYhTQVQgghhDALaSqEEEIIYRbSVAghhBDCLKSpEEIIIYRZSFMhhBBCCLOQpkIIIYQQZiFNhRBCCCHMQpoKIYQQQpiFNBVCCCGEMAtpKoQQQghhFtJUCCGEEMIspKkQQgghhFlIUyGEEEIIs5CmQgghhBBmIU2FEEIIIcxCmgohhBBCmIXWVk+8ddFK3N1KZk/zRO0Otk7BonTJKbZOwaJi/6hp6xQsRp+ZAytsncWDc4jLQqvR2zoNi9AFXbR1ChalcnCwdQoWta3WYVunYDGpaXq8ihlbMv+qCyGEEMLqpKkQQgghhFlIUyGEEEIIs5CmQgghhBBmIU2FEEIIIcxCmgohhBBCmIU0FUIIIYQwC2kqhBBCCGEW0lQIIYQQwiykqRBCCCGEWUhTIYQQQgizkKZCCCGEEGYhTYUQQgghzEKaCiGEEEKYhTQVQgghhDALaSqEEEIIYRbSVAghhBDCLKSpEEIIIYRZSFMhhBBCCLOQpkIIIYQQZiFNhRBCCCHMQmvrBO6b81OoXMaD2g/yglHS3oa8M6ZjHbqjcp0MmgqAFnRXUTK+hew/jOM0VVC5vQL2zQEN6C6hJE0D/Q1LV1NI32c7MeT5HniV8iDs/DWWv/YToSfCTcZWqBnAM7P6U61BBUqX9+WL2T/z+xfbjWLUahVP/68fnYe2xKuUBwnRyWz/6QA/frjRGuUU0m9KD4bO7Ie3vyeXT19l2QsrCDl6yWRshdrlGD1vONWaVMa/YimWv7SSDZ/8YxSzOmwZ/hVLFXrsn8s3s3Tatxap4V6GV2zO6Cpt8XVwJTQ1mvfP/c255OsmYweVb0Lfcg2p6lYagAspUSwN3mYU723vwvTa3WnlVxU3O0dOJFzl/XMbichItEo9JUnfYc0ZMqo13j6uhIXGsHzRP4ScN31seg1sQtc+DahQpeDcuhQUxcrPdhjiNVo1Y6Z0oVmbapQp50VGejYnD4fx7afbSYxPs1pNdzL3e8vJ1ZEx74ygzYDmeJby4NLJcJZPX0noscvWKKeQvpO6MvSl3niX9iDsbATLZnxPyLEwk7G9xnak61PtqFi7HAAXT4azcs4vheJHvTmYXmM74erpzPmDoXz6wkqiLsdYuhTTzP23Te2Dyu1VsG8DanfIPYqS+jborlq0jPueqdizZw99+/YlICAAlUrF77//boG0iuD4BCq32Sjpn6HED4D8IFReK0DtbTpeSUZJ/xwlYRhKQl+UrPWoPN4H+7a3YzTlUfn8BPlhKIlPF8SlLwNyrFGRkfYDmzHh3WGsWfQX0zq9Tdi5a7z363Q8fN1Mxjs42RN9JY4Vb68nMTrZZMzQF3vRe2xHlr/6IxNbvsmKeesZ8nxP+k/sYrlCitBhWGsmfTSaNW+v47kmrxF25ioLNr+Op5+7yXgHZwduhMfy7awfSLiRZDJmWvNZDCszwfDzare3Adi97qDF6ihKj4C6zKzdiy9DdzJiz+eEpEbzeYvReNu7mIxv6lOJTdfPMv7gCp7Z/xUxWSl83nI0pRxvH++Pm42knLM304/8yPDdn3MjK5kvW47FSWNnrbLMwqbjBtChex0mzujBD1/tYurILwm7GM17y57Bw8v0sanfpCI7N5/l1YmreGnMN8TFpDJ/+TP4+BUcGwdHO6rWLMOP3+xm6sgveHvmWspV8GXex09asywDS7y3Znz9HI271mfhqKVMrP8yx7edZtG2t/AJKGK8taAOQ1owaeFTrHlvA1NavUHYmQjm//lakfU1aF+LXb8c5JWe7zG941ziIhNZ8Ndr+AR4GWKGvdyHAVO68+kLK3ih/RyyM3JY8Ndr2DnY4L1lgb9tKs/PQROIkvQcSnx/0EWh8v4OVE4WLeW+m4qMjAwaNGjAsmXLLJHPPamcx0HmWshaXzCbkPoWKFngNMT0A3KPQM420F0GXQRkfgf5Iajsm97ep+tLkLMbJX0R5F8oiMv5F/TW/yQ4aEo3Nn+/l20/7ici5AZLZ6whJzOXHk+1NRkfevIK38z5ld2/HSUvN99kTO3mVTi06RRHtp0l5loC+/48zold56nRuJIlSzFp8Et92PTNDras2kVEUCSfTP6qoL5xnU3Ghx67zNevrmbX2gPk5eSZjEmJTyUpJtnw07JPE65fiubM7guWLMWkZyq35reIY/xx7SRh6XG8e+YvsnV5DCjf2GT87JO/8svVI4SkRnMlPZ65p39HjYrmvlUAqODiQwPv8rx35i/Op1znakY87575C0eNlp5l61uztIdmy3EDYNBTrdm84Thb/zxFRHgcn763kZzsPHr0b2QyfuEb69m47ihhodFcuxLPkrf/QKVS0ah5ZQAy03OYNeV79mw7T+TVBILPRrJs4d9Ur10WP38Pa5YGmP+9Ze9oT7vBLfj6tTWc3RtE1OVoVs9bx/VL0fR9rrulyylk8Au92LRyJ1tX7yEiOIpPnl9JTlYOPUZ3MBn//tjP+eur7YSdieBa6A2WPPc1KrWaRh3rGGIGTu3Jjwv/4ODGE4Sfu8ai8V/gU8aTNv2aWKssA7P/bdNURGXfqGA/+WdBF17w/3EExz4WreW+m4pevXrx7rvvMnDgQEvkcw92YFcHJffAHdsUyD2Ays70wFCIfSvQVELJPXpzgwocOqLkX0HltQKV3yFU3r+CQ1dzJ/+ftHYaqjWowMk7/hgqisLJ3UHUalb5gfd74chlGravRdkqBVPsleqUo06Lahzdfvahc74fWjst1ZtU5sT229N5iqJwYvsZaresbrbn6PJUO7as/Ncs+7uv51ZpqOURwKH429OrCgqH4i9T3yuwWPtw1NihVWtIzc0EwE5dcHUyR3970FdQyNXraORd3ozZW57txg3QajVUq1WGE4fvODaKwsnDYdSuX7xj4+Boh1arIS01q8gYF1dH9Ho9GWnZD53z/bDEe0ujVaPRasjLzjXanpuVS902NR8q3/ultdNQrVElTv573rBNURRO/nueWs2rFmsfDs4OaO00pCWlA+Bf0Q+fMp6c+PecISYzNYvgo5ep1aKaeQv4Txb426ayv7mbO4+fAuQafai2hMdnTYXaC5VKi6KPN96uSwD7KkU/TuWKym/fzRdZj5I6F3L339ynDyq1K7hMRElfAmkfgEM7VJ7LUBKfgbwjFiqmMHcfVzRaDclxqUbbk+NSCazu/8D7/eXjTTi7OfH14XfQ6/SoNWq+e3cDO389/LAp3xcPXzc0Wg1JMSlG25NiUwisWdYsz9F6QDNcPV3YumqXWfZ3P7zsndGqNSTkpBttT8hJp5Krb7H2Mb12d+Ky0wyNyZX0OKIyk3mhVnfeOfMHWfl5PFO5Nf5OHvg5mL4kJgpz93QueG8lGh+bpMR0AisW79g8+0I3EuLSjBqTO9nZa3n2xW7s2nyOzAzrXjq1xHsrKz2b8wdCeOqNIUQEXScpJoVOT7ahVqvqRF2KNkfaxeZ+q75YE/XVKFOsfYx/dwQJN5I4cbMx8fb3BCA51ni8TYpNxau0lWeaLPG3LT8MRXcdlevLKKlvFsx6uIxFpSmDovazUCEFLN5U5OTkkJNz+02Wmpp6j2gLUDJQEvqBygXsW6Fym4WiiyiYPro1UZOzAzJXFfz//CCwa4zK+UmUFOs1FZbSfmBTOg9twcKJX3M1KIoq9QKZNH8ECdEpbP/5wH/v4DHSa1xnjmw6WeQ14kfZuKrt6BlQj2cPrCBXX3ApK1/RM+PYT8xtMIB9PV8nX6/jcHwYe2NCUalsnLCF2XzcuMOwMW3p2KMur0xcZfIyo0ar5vWFQwFYusA2C6AtYeGopcz8dgo/X/8KXb6OiyfC2fnTPqo3efCZU1sYPrMvHYa25JUe7xV5GfWxdM+/bfkoSVNReSxAXfo4ipIPuQdQcnYBlh08LN5ULFiwgHnz5j38jvRJBS+M+q5PFhof0Mfd44FKwTUnKGgYtFVQuUxGyT1yc595KPl3rZDOvwz21r2ulpqQji5fV2jhkaefe6FPIPdj/Lyh/PLxJnb/VjAtdiXoOqUCfRg+vZdVm4qU+DR0+bpCnwK8SnmQVMQi0/tRqrwvjbrWZ97gDx56Xw8iKTeTfL0OHwdXo+0+Dq7E3zV7cbdRldswtmo7Jh1cxcU045XnQSlRDN+zHFetA3ZqDUm5maxpO5HzyVFmr+FRYrZxA0hNzix4b3kbHxsvb1eSEu59bIY805rhY9vyv8nfE36x8F0BGq2a198fRukynrw6aZXVZynAcu+tG2ExvNxpDo7ODji7O5EYnczrP73EjbDYh8z4/qTeqq9U4foSo+89Ng6Z/gTDX+7Da73fJ/zcNcP2WwvbPUu5Gy1y9yrlzuUzEWbLvVgs8bcNIP88SkI/FJUrYA9KYsHl/TzLXvq2+PdUzJo1i5SUFMPPtWvX/vtBJuVB3nlU9q3u2KYC+9YoeSfvYz/q29ebyIO8s6i0dy1a1FYEnXUH7fw8HRdPX6Vh+1qGbSqVioYdahJ01PSUa3E4ONmj1ytG2/Q6PSq1dT/q5uflE3o8jEZd6hm2qVQqGnWpx4VDoQ+9/x5jO5Ecm8Lhv0889L4eRL6iIygliha+tz/FqVDRwrcyZ5KKPufHVGnLxOodmXLoey6kFH3OpefnkJSbSXkXb2p7lmVXTJBZ83/UmG/cgPx8HReDbhgWWcLN91bzSlw4U/R+h45uw8jxHXh92houBhU+NrcairLlvfnf5O9ISyl6vYUlWfq9lZ2ZQ2J0Mq6eLjTt0YADfx797weZUX6ejosnw2nY6fYiS5VKRcNOdQg6YvqWWYChM3rz1P8GMLv/Ii7edVt+9JU4Em4k0+iOfTq7OVGzWRWCDl80fxH3ZIm/bXdQ0kFJLLj91K4uSs6Oh034niw+U+Hg4ICDg4NZ9qVkrkDlsQjyzkHeGVQuYwpuj8laD1DwO10MSvpHBQ9wmVQQq4sA7MGhAzj1R0mdc3ufGd+g8vwYco9C7iFwaA8OnVESnzZLzvfjt+XbmLlsHBdPXSXkRDgDJ3fF0dmBrT8WXCebuXwcCTeSWfnOb0DBAqbyNQJu/n8tvmU8qVw3kKyMHG6EF3yaOLz5NCNefoK4yASuBkdRpX55Bk7pztYf9lm9vvVLNvLqqqmEHrtMyJFLDJzeG0cXB7as3AnAq6umER+VyIrZPxpqqnDzPnM7ey2+ZX2o0qAiWenZRF2+fV1XpVLRY0wntn2/G71Ob/W6blkddoB3Gg7ifPJ1ziVf5+nKrXDS2PN7REGj827DwcRmp/Jp8DYAxlZpx5QanfnfyXVEZSUbZjky83PJ0hUssOpWpg5JuRncyEqhmltpXq37BDujgzgYZ5vvCrAWc44bAL/9cICZ8wYSeuE6IeevM3BkKxyd7Nn6Z8Gg/crbA4mPTWPlZwXf8zJsdFueea4TC2f/SkxUMl4+BccmKzOX7KxcNFo1by4aTtWaZXjrxR9Qa9SGmLSULPLzdWbLvTgs8d5q2r0BqFREhkQRUNWfiYue4VrwdcM+rVrfp5t45etJXDweTvCxywya1hNHZwe2fL8bgFe+mURCVBIr3voFKLhddNSbg3l/zHJirsYbZnGy0rPJvjmbtGHZZka+NoDrl2KIvhLLmDlDSLiRzP4/j1u9Pkv8bcOhZ0EzobsB2uqo3N+AnO2Qa9mx/76bivT0dC5dut0dhoeHc+rUKby9vSlf3sIr0rP/QVF7o3J78eYXhAShJD0L+oSC32sCKFjhWkClcgb3uaDxByW7YPFKykzIvuNLXnK2oaTOQeUyCdzfhPxwlORpkGf9E2vPhqN4+LjyzKz+eJVyJ+zcNd4Y+rFh8Wapcj4od8w6+Ph7snzP7ZNoyPM9GfJ8T87sC+HVfgWXAZb/70dGzR7A1A+fxtPXjYToZDat2s0PH/xl3eKA3b8cwNPPndHzhuPl78nlU1eY3es9km8uwCpV3te4vgAvvjh5+3LGsJn9GDazH6d3nWdm57mG7Y271qN0BT82r7D+XR932hJ1Di97F6bU6IKvgyshqTeYcvh7EnMzAPB38kDP7aZnaMVm2Gu0LG5q/N0Gn4f8yxehBQO3n6MbM+v0wsfBhbjsdDZGnuLL0F1Wq8lcbDpuALu3nsfDy4VRz3XGy8eVsJBoXp+2muTEgmPj5+9hNKPXe2hT7O21vPnhCKP9rP5yJ2u+3IWvnzutOhbcBfH52ilGMa9MWMmZ41csW9BdLPHecvZw5tn5I/Et50NaYjr7fjvMitd/Qmflhglg96+H8fB1Z9Rbg/Eq7UHYmau83n+RYaFlqUDj+vpM6IK9gx1v/fSi0X5Wv/sbq98r+FD2y0cbcXR2YPpn43D1dObcgVBm91tkm3UXlvjbpimFymU2qG9eRsn6/eZ3MFmWSlEU5b/Dbtu1axedOnUqtH306NGsWrXqPx+fmpqKh4cHSaGVcXcrmd8S/kRt0/dOlxS65Adf4/E4iP3DurfMWZMuM4fzIz4gJSUFd3fTXxxkCeYaNzrXfw2txnwzGI8S/Snrf7eKNanMOPP0KNocbt076qwpNU2PV/WwYo0b9z1T0bFjR+6zDxFC/D8n44YQ/z+UzKkCIYQQQlidNBVCCCGEMAtpKoQQQghhFtJUCCGEEMIspKkQQgghhFlIUyGEEEIIs5CmQgghhBBmIU2FEEIIIcxCmgohhBBCmIU0FUIIIYQwC2kqhBBCCGEW0lQIIYQQwiykqRBCCCGEWUhTIYQQQgizkKZCCCGEEGYhTYUQQgghzEKaCiGEEEKYhTQVQgghhDALaSqEEEIIYRbSVAghhBDCLKSpEEIIIYRZSFMhhBBCCLPQ2uqJ6+14BrWTo62e3qJ8BtvbOgWLUufbOgPLSruo2DoFi9FnZ9s6hYeic9Si0trZOg2L0Hp62DoFy3JwsHUGFvV3Zsn8ewaQmakrdqzMVAghhBDCLKSpEEIIIYRZSFMhhBBCCLOQpkIIIYQQZiFNhRBCCCHMQpoKIYQQQpiFNBVCCCGEMAtpKoQQQghhFtJUCCGEEMIspKkQQgghhFlIUyGEEEIIs5CmQgghhBBmIU2FEEIIIcxCmgohhBBCmIU0FUIIIYQwC2kqhBBCCGEW0lQIIYQQwiykqRBCCCGEWUhTIYQQQgizkKZCCCGEEGYhTYUQQgghzEJr6wTu16gajZlYtwV+Ti4EJcYy58g2TsffMBk7oloDBlepSw1PPwDOJkSz6ORuo3hnrR3/a9KR7oHV8HJw4lp6CiuDjvFD6ClrlFPIsI4NGNWjKT4eLoRei2PRTzs5fyXaZOzAdvXo06oWVQJ8AQi6GsNnG/YbxU/q24ruzWrg7+1GXr6OoKsxLPt9P+fCTe/T0oZ2bsAzvQrquxgRxwc/7OR8EbkMaF+P3m1qUaXszfquxLB8/X6j+In9W9G9RQ1K36rvSgzLf9vP+TDb1PdMg4ZMaNoUPxcXguLimLvzX85Em85leL16DKpVm+q+BfWdi4nhg/37CsVX8fbmtXbtaVGuHBq1mksJCUz560+i0tIsXk9J0m9QE4aNbIW3tyuXL8Xw2ZIthARFmYx9om8juvWqR8VKBWPHxZBovv1yp1H8qHHt6di1Nn6l3MnP03ExJJoVX+0k+ILpfVpa32c7MeT5HniV8iDs/DWWv/YToSfCTcb2HNWOrsNbUaFWWQAunbrKync3FIp/ZlZ/ej3TDhcPZy4cvsTSmWuICou1eC2m9B3TniFTuuLl507Yhessf/0XQk9dNRnb86nWdB3aggo1AgC4dCaClQv+LBT/zCu96fVUG1zcnbhwNIyl//uZqPA4i9diSkX3EVTxGIODxpfU3BDOJSwgOeecyVh/5y5U85qAizYQlUpLRl4EYSnfEZm+0RDTt/JZk4+9kPARl1NWWaIE4D5nKhYsWECzZs1wc3OjVKlSDBgwgJCQEEvlVkifijV5o1lnPjm9jz5/rSQoKZbVXYfj4+hsMr6Vf3n+DL/AiC0/MvCf74nKTGV1t+GUdnY1xLzZrAsdAiozfe9Guvz+Dd9eOMrbLbrTNbCqtcoy6N60OjOGdeCrvw4x8p01XIyMY9n0QXi5OZmMb1KjHJuPhDDxo3WMef8nYpLSWP7SIPw8b9d3NSaJhT/9y7C53zNu0VqiElJZNn0wnq6m92lJ3ZpX56URHfj6j0M8PXcNodfiWPryPeqrWY4th0KYvHAdY9/9iZjEND6bWbi+RWv+ZcSb3zN+/lpuJKSy7OXBeBaxT0vqXb0Gszt04NNDB+m7ZjVBcXF8N2gwPk6mc2lZLpC/QoIZue4XBv/0EzfS0vh+0GBKu96ur7yHB78MH8HlxESe/OUXnvj+O5YeOkROfr61yjILW48dHbvUZvLz3Vi9Yi+Tx31D2KUY3l/8JJ6epseOBo0rsHPbeWa+sIYXJq0iNjaVhUtG4uPrZoiJvJbAZ4u3MHHUV0yf8h3R0cksXDISjyL2aUntBzZjwrvDWLPoL6Z1epuwc9d479fpeNyR753qt6nBrvVHeK3fh7zUYwFxUUnMX/8SPmU8DTFDX+hJ/4ld+PTlNUzvNp/szBze+/Ul7Bys/1m0fb/GTJg7iDUf/cO0Hu8TdiGS936ahoePq8n4+q2rs2vDMV4b8gkv9f2woL6fp+Hj72GIGTq1G/2f7cinr/3M9N4fkJ2Zy3s/TbNJfQEuPajt8wqhSV+w5/owUnNDaeH/JfZqb5PxefoULiZ9xb6op9kdOZhrab/TwO8d/JxaG2K2Xu1o9HMq9k0URc+NjO0WreW+mordu3czdepUDh06xLZt28jLy6N79+5kZGRYKj8j42s35+eLp1l36SwXUxKYfXAzWbo8hlWtbzL+xb1/sTrkJBeSYrmcmshrBzahRkUb/4qGmCZ+ZVl/+SyHYiKIzEjhp4unCUqKpaFvGavUdKenujVhw95z/HngPOE3EnlvzXayc/Pp36auyfg3vtnEul2nCb0Wx5XoJN7+bhsqlYrmtQINMZuPBHMkKILr8SmERSWw+JfduDk7UL2cr7XKMniqexN+33OOv/adJzwqkQXfF9TXr53p+t78ahO/7iyo72p0Eu+uvFlf7dv1bTkUzJELEVyPK6hvyU+7cXV2oJoN6nu2SRPWnjvLr+fPcykxkTe2byMrP4+hdeuZjH9p0z+sOX2aoLg4wpIS+d+2rahUKloHljfEvNymLbvCw1m4dw8X4mKJSElhR9hlErKyrFWWWdh67Bg8vAX//HWSLf+cJuJKPB9/8A85OXn07NPQZPyCeb/z54bjXL4Yw7WIBBa/vxGVWkXjphUNMf9uO8+JY+HciErmang8X3y6DRdXRypXKWWVmu40aEo3Nn+/l20/7ici5AZLZ6whJzOXHk+1NRm/aNI3bFyxi7Bz14i8GM3HL6xCpVbRsH0tQ8zAyV356aONHNp0ivALkXzw3Ap8/D1p3buRtcoyGDSpC5t/OMC2tYeICI1m6as/k5OVS48nW5mMXzR1FRu/20vY+UgiL8Xw8cs/FNTXroYhZuCETvz08WYObTlDeFAUH7zwHT6lPWjds4G1yjKo7DGKiNT1XEv/nfS8MM7Ev41OyaK820CT8QnZx4jO/Jf0vHAy8yMJT/2BtNxQvB0bG2JydAlGP/4unYjPPkJmfqRFa7mvpmLz5s2MGTOGOnXq0KBBA1atWkVERATHjx+3VH4Gdmo19Xz82Rd1xbBNAfZFXaGxX9li7cNJY4edWk1y7u0B+XjcdboGVjPMXrTyL08ldy/23PE81qDVqKlVoTSHg25PzykKHA66Sv0qxWtwHO21aDUaUjOyi3yOQe3rkZaZTWikdaf4tBo1NSuW5vB54/qOXLhK/arFrM+hoL6Ue9Q3sOPN+q5Ztz47tZq6pUuz/2qEYZsC7L8aQaMyxavPSavFTqMmJbugPhXQqXJlwpOSWDVoMEcmP8dvT46kWxXrz6I9LFuOHVqtmuo1ynDi6O2pfUWBE8euULtu8cYOB0c7tFo1qammmzmtVk3v/o1JT8vm8qUYs+RdXFo7DdUaVODk7guGbYqicHJ3ELWaVS7WPhyc7dFqNaQlFTR5/hV88fb35OSuIENMZloWwcfDqNWsinkL+A9aOw3V6gdycm+wYZuiKJzcG0ytJsWsz+lWfZkA+Jf3wbu0Byf33p4ty0zLJvjkFWo1rWTeAv6DCi0eDrWJzzp0x1aF+KxDeDkWr8HxdWyBi11FErJNv5/sNT6Ucm7HtdQNZsj43h5qniclJQUAb2/TUzTm5OXgjFatJj7b+JNNfHYGVTx8irWPWU06EpOVzv47GoY5h7exoFVPjgydRp5eh15R+N+BzRyJuWbO9P+Tp6sTWo2axNRMo+2JqZlU9C/e6/vC4HbEJadz+EKE0fZ29SuxYEJvHO3tiE/J4Lkl60lON/2H2VI83YqoL6X49T0/tB3xyekcOW9cX9sGlZg/+XZ9Uz9cT4qV6/Nycio4PzPvOj8zM6lSzPfHa+3aE5Oewb6IgsbLx9kZV3t7JjdvzuL9+1i4dw8dKlbi8379GLnuF45EWvYThyVZc+zw8HRGo1WTlGh8bJIS0wksX7yxY8JznUmIT+fEMeM1By1aV+WNeYNwcLQjMSGN16b/QGqKdWeR3H1c0Wg1JMelGm1PjkslsLp/sfYxbs4QEqKTDY2JV2kPwz7u3qdXKY9Cj7ckd+9b9RmvIUqOSyOwajHre2MACTEphsbEq5T7zX3cXV8aXn7uZsi6+Ow1XqhVWnJ0CUbbc3QJuNoV3eBoVa50q7ADtcoORdFzNuFd4rMOmowNdO1Hvj6TG5mWvfQBD9FU6PV6pk+fTps2bahb1/T0NUBOTg45OTmG/05NTS0y1pKeq9uSvpVqMXzLj+TodYbtY2o1oZFfAON2/Mr1jBRalA7knZbdiMlKY/8N04uAHkVjejajR/OaTPzgF3LzdUa/Oxp8jSffXoOnmxMD29Vj4aQ+jJr/I0lpj88U+ugnmtG9eU0mLSxc37Gga4ycswZPVycGdqjHguf6MOadx6u+yc2a06dmDUb+8gu5uoL61CoVANsvX2LFiRMABMXF0TgggKfqN3hsm4rijB2PyrgBMOLp1nTsWoeXp60mL9f43Dt94iqTxnyNh6czT/RtxBvvDOb5CStITs4sYm+PnmEv9qLjoOa82vcD8nIer7U6xTFsWjc69m/Cq4M/LlH15SsZ7I4cglbtjK9TC+p4v0JmXiQJ2ccKxZZ3G8j19L/RK7kWz+uBbymdOnUq586d4+eff75n3IIFC/Dw8DD8BAYG3jO+KEk5meTr9fg6uhht93V0IS7r3tdlJ9ZpznP1WvL0trUEJ92eFnfQaHmlUQfePfovOyIvEZwUx3fBJ9gYHszEOi0eKM8HlZyeRb5Oj7e78SIvb3dnElLvXd8z3ZswtlczpixZz8Xr8YV+n52bz7W4ZM6G3eDt77ai0+kZ0LboRtASktOKqM/jv+t7umcTxvRuxrSP1nMp0nR9kbHJnAu7wTsrt6LT6+nf3rr1JWVlFZyfznedn87OxP3HuoHxTZoyuVkzRq9fT3D87fqSsrLI0+m4mGD8CeZyYgJl3EwvwHscFGfsMNe4AZCSnIkuX4+Xt/Gx8fJ2JSkx/Z6PHfpkS0Y83Zr/vfQj4ZcL3/WQnZ1H1PUkgs5f56P3N6LT6enVt+ED5/ogUhPS0eXr8LzrE7annztJMSn3fOzgad0ZNr0XswcvJvzC7Sb11uNM7jP23vs0t9TEW/UZn/Oefm4kxd672Rw8uQvDpnVn9pOfEX7HnTu3Hle4PjeS4qzbwObqktAr+ThojGfNHDQ+hWYvjClk5l8jNTeEsJTvicrYRlXP8YWivB0b42pfiYi09WbO3LQHaiqmTZvGxo0b2blzJ+XKlbtn7KxZs0hJSTH8XLv2YJcV8vR6ziZE06ZMRcM2FdCmTAVOxF0v8nGT6rTg+fqtGb3tF84mGN+qZ6dWY6/RoEcx2q5T9IZPidaSr9MTdDWG5rVuL9JTqaB5rfKcuWz6llmA0T2aMr53S6Z9soGgq8W7lqtSqbDXWneFc75OT/CVGJrXNq6vWa3ynLlUdH2jejVlfN+WPP/RBoKuFK8+tQ3qy9PrORcTQ+vyd9QHtC5fnpM3iq5vYtNmPN+yJWM2/MbZGOP68vR6zsTEUNnL+BJBRS8votJs98n9YRR37DDXuAGQn68nNOQGje+4Vq5SQaMmFblwruixY9jIVjw9pi2zXv6J0OCij+Gd1GoVdnZWfm/l6bh4+qrRIkuVSkXDDjUJOhpW5OOGPN+TkTP78MbQj7l4162W0VfjSYxOpmGH2/t0dnOkZpPKBB29bP4i7iE/T8fFM9do2Pb2IkuVSkXDtjUIOn6P+qZ0ZeRLvXhj5DIunja+ZBodkUBiTIrRPp1dHanZqCJBx0zfhmspCvmk5FzA1+nOD7IqfJ1akpR9utj7UanUqFX2hbaXdxtEcs55UnNDzZDtf7uvs19RFJ5//nk2bNjArl27qFTpvxe0ODg44ODg8MAJ3umbC0f4qG0fziTc4HT8DcbVaoqz1p51l84AsLhtH6Iz01h0YjcAk+u2YEbDdry45y8i01PwuznLkZGfS2Z+Hul5uRyMjmB2k05k5+ffvPxRnsFV6vLOsX/NkvP9+GHbceaN68mFKzGcD49mZNfGONnb8ef+8wC8Pa4nsUnpfLZhHwCjezbjuX6tmP3NJqLiU/C5OQuQmZNHVk4ejvZaxvduwe7TYcQnp+Pp6sSwTg0p5eXKtuPWOcGM6tt6nLnjb9YXFs3I7o1xcrDjr30F9c0b35PY5HSW/XqzvieaMWlAK974chM3iqhvXN8W7DkZRnzKzfq6NMTPy5XtR61f37fHj/Nhz56cjYnmdHQ0Yxs3xtnOjl/PF9xr/mHPnsSkp/PBvoL6JjVrxvRWrXlp0z9EpqTg63yzvrw8MvPyAPj62FE+7d2HI9cjOXTtGu0rVqRL5SqM/OUXq9f3MO537DDnuAGwfu1hXn29HyHBNwi5cJ1Bw1rg6GjH5r8LBu3X3uhHfHwa336xE4DhT7Vi9PgOLJj3O9E3kg2zHFlZuWRn5eHoaMfI0W05uC+UhPh0PDyd6D+oKb6+buzeeaHIPCzlt+XbmLlsHBdPXSXkRDgDJ3fF0dmBrT/uB2Dm8nEk3Ehm5Tu/AQW3iz4zqz8LJ35NTES8YY1BVkYO2RkFl502fLGdJ1/uTdTlGKKvxjNq9gASopM58PdJ69f35Q5mfjKKi6cjCDl1hYETOhfU93PB4saZn44iITqZlfP/LKhvajeeeaU3C6euIuZaomGdRFZGDtmZN+v7eidPTu9JVHgs0REJjHqtDwkxKRzYXPw/5OYSlvI9Df3eIznnPMk5Z6ns8QwalRMR6b8D0NDvPbLzYwlO+gSAqp7Pkpxzgcy8a6hVdpRybkc51z6cjX/XaL9alQtlXLpxIeFDq9VyX03F1KlT+fHHH/njjz9wc3Mj+uaX9Hh4eOBUxL345rTxSjA+js7MaNgOPycXLiTGMmr7WuKzC65fBri4o1duzzo8XaMxDhotX3Qyvi1nyal9fHy6YGB/fvcfvNqkA5+074unvSORGal8cHIPa0Ks/8bZeiwULzdnnuvfGh93Z0KuxTHtk99ITLu5Ytnbzai+oR3qY2+n5cPn+hrt58s/D/LlXwfR6xUq+nvTp1UdPF0dScnI5vyVaJ5dtJawqHtNq1nGtiMF9U0e0BofD2dCI+J4fvFvhsWb/j7G9Q3uVFDfomnG9X31+0G++uNmfWW86dPmZn3p2Vy4Es2EBbap7+/QELydnXipdRt8nZ0JiotjzG/ric+8eX66GZ+fT9VvgINWy/K+/Yz288nBA3xysGDB1dZLl3hz+3aea96cOZ06EZaYxJS//uRYVNGfsB9Fth47du24gIenM2PGd8DL24XLF2OY9fJPJN+826FUaQ+jY9N3YBPs7bXMeW+I0X6+/3YP36/Yg06vJ7CCD917Dcbdw5nU1CxCg6J4acp3XA0vfInO0vZsOIqHjyvPzOqPVyl3ws5d442hHxsWIpYq54Oiv11fn3EdsXew483vphjtZ83CP1mzsOAP87pPN+Po4sALS0bh6uHM+UMXeWOobdYl7PnzBB4+bjzzah+8/NwIO3+dN0YuIzm+YPFmqbJexvWNbldQ3zcTjPaz5sO/WfPRPwCsW7YNR2d7XvhgJK7uTpw/cpk3Ri6zSX1RGVuw13hTw2sqDlpfUnOCORw9mdyblz+ctGXgjhl1jcqZer6v46QpjU7JIT0vnJOxs4jK2GK03wDXXqhQcT19k9VqUSmKovx32M3gIi4JrFy5kjFjxhRrH6mpqXh4eFDu8zmonRyL+9SPFZ99haegShJ1yVnrZFJivWK/JR47+uxsrr7+BikpKbi7W2+V+8OOHbfGjQ7NX0erLZnjhjboiq1TsCwzzjw9iqbu32PrFCwmM03HiIZBxRo37vvyhxBC3C8ZO4T4/0H+QTEhhBBCmIU0FUIIIYQwC2kqhBBCCGEW0lQIIYQQwiykqRBCCCGEWUhTIYQQQgizkKZCCCGEEGYhTYUQQgghzEKaCiGEEEKYhTQVQgghhDALaSqEEEIIYRbSVAghhBDCLKSpEEIIIYRZSFMhhBBCCLOQpkIIIYQQZiFNhRBCCCHMQpoKIYQQQpiFNBVCCCGEMAtpKoQQQghhFtJUCCGEEMIspKkQQgghhFlorf2EiqIAoM/KsfZTW40uV2/rFCxKybd1Bpalz1ZsnYLF6LOzgdvvw8fFrXzzdSV33EDJtXUGlqVX2ToDi8pM09k6BYvJTC+orTjjhkqx8ugSGRlJYGCgNZ9SCHGXa9euUa5cOVunUWwybghhe8UZN6zeVOj1eqKionBzc0OlsnznmpqaSmBgINeuXcPd3d3iz2dtUt/jzdr1KYpCWloaAQEBqNWPz9VPGTfMS+p7vD3K44bVL3+o1WqbfEJyd3cvkSfXLVLf482a9Xl4eFjlecxJxg3LkPoeb4/iuPH4fFQRQgghxCNNmgohhBBCmEWJbyocHByYM2cODg4Otk7FIqS+x1tJr+9xVdKPi9T3eHuU67P6Qk0hhBBClEwlfqZCCCGEENYhTYUQQgghzEKaCiGEEEKYhTQVQgghhDCLEt1ULFu2jIoVK+Lo6EiLFi04cuSIrVMymz179tC3b18CAgJQqVT8/vvvtk7JbBYsWECzZs1wc3OjVKlSDBgwgJCQEFunZTaff/459evXN3xxTatWrdi0aZOt0xJ3KKljR0keN0DGjkdBiW0q1q5dy4wZM5gzZw4nTpygQYMG9OjRg9jYWFunZhYZGRk0aNCAZcuW2ToVs9u9ezdTp07l0KFDbNu2jby8PLp3705GRoatUzOLcuXK8f7773P8+HGOHTtG586d6d+/P+fPn7d1aoKSPXaU5HEDZOx4JCglVPPmzZWpU6ca/lun0ykBAQHKggULbJiVZQDKhg0bbJ2GxcTGxiqAsnv3blunYjFeXl7KN998Y+s0hPL/Z+wo6eOGosjYYQslcqYiNzeX48eP07VrV8M2tVpN165dOXjwoA0zEw8iJSUFAG9vbxtnYn46nY6ff/6ZjIwMWrVqZet0/t+TsaNkkbHD+qz+D4pZQ3x8PDqdjtKlSxttL126NMHBwTbKSjwIvV7P9OnTadOmDXXr1rV1OmZz9uxZWrVqRXZ2Nq6urmzYsIHatWvbOq3/92TsKDlk7LCNEtlUiJJj6tSpnDt3jn379tk6FbOqUaMGp06dIiUlhV9//ZXRo0eze/fuR2pwEOJxJmOHbZTIpsLX1xeNRkNMTIzR9piYGPz9/W2Ulbhf06ZNY+PGjezZs8cm/+y1Jdnb21O1alUAmjRpwtGjR/nkk0/48ssvbZzZ/28ydpQMMnbYTolcU2Fvb0+TJk3YsWOHYZter2fHjh2P1LUnYZqiKEybNo0NGzbw77//UqlSJVunZHF6vZ6cnBxbp/H/nowdjzcZO2yvRM5UAMyYMYPRo0fTtGlTmjdvzscff0xGRgZjx461dWpmkZ6ezqVLlwz/HR4ezqlTp/D29qZ8+fI2zOzhTZ06lR9//JE//vgDNzc3oqOjAfDw8MDJycnG2T28WbNm0atXL8qXL09aWho//vgju3btYsuWLbZOTVCyx46SPG6AjB2PBFvffmJJS5cuVcqXL6/Y29srzZs3Vw4dOmTrlMxm586dClDoZ/To0bZO7aGZqgtQVq5caevUzGLcuHFKhQoVFHt7e8XPz0/p0qWLsnXrVlunJe5QUseOkjxuKIqMHY8C+afPhRBCCGEWJXJNhRBCCCGsT5oKIYQQQpiFNBVCCCGEMAtpKoQQQghhFtJUCCGEEMIspKkQQgghhFmU+KYiJyeHuXPnPlLfOGZOUt/jraTX97gq6cdF6nu8Pcr1lfjvqUhNTcXDw4OUlBTc3d1tnY7ZSX2Pt5Je3+OqpB8Xqe/x9ijXV+JnKoQQQghhHdJUCCGEEMIsrP4Piun1eqKionBzc0OlUln8+VJTU43+t6SR+h5v1q5PURTS0tIICAhArX58PlPIuGFeUt/j7VEeN6y+piIyMpLAwEBrPqUQ4i7Xrl2jXLlytk6j2GTcEML2ijNuWH2mws3NDYD2tV9Eq3Gw9tNbxajvHqF/htYCvhvfy9YpWFxCPTdbp2ARutxszv/0juF9+Li4lW+lGW+hdnC0cTaW4RGmt3UKFuXx22lbp2Bxv50/busULCI1XU+FxleKNW5Yvam4NXWp1TiU2KbC2U1j6xQsSqspmYP6nTT2JbtGa1xCMKdb+aodHNE4lsxjo7Ev2U2FVmVn6xQszt3t8bmk+CCKM26U7FdACCGEEFYjTYUQQgghzEKaCiGEEEKYhTQVQgghhDALaSqEEEIIYRbSVAghhBDCLKSpEEIIIYRZSFMhhBBCCLOQpkIIIYQQZiFNhRBCCCHMQpoKIYQQQpiFNBVCCCGEMAtpKoQQQghhFtJUCCGEEMIspKkQQgghhFlIUyGEEEIIs5CmQgghhBBmIU2FEEIIIcxCmgohhBBCmIU0FUIIIYQwC62tE7hffYc1Z8joNnj7uBIWGsPyhX8Tcv66ydheA5vQtU9DKlQtBcCloChWLt1uiNdo1YyZ0oVmbatTppwXGenZnDwcxrefbiMxLs1qNd2pisdQaniOwlHjQ3LuRU7GLSIp57zJ2LIunajpNQ5Xu0DUKi3peRGEJK8hIu0fAFRoqevzHGWc2+JiV5Y8fToxmYc5m7CUbF28Ncsy6DukGUOfbl1w/C5Gs+zDTYRciDIZ26t/Y7r2rk/FygXH72LwDVYu32GI12jUjHmuM81bV6VMWS8y0nM4cTSMbz/bTmJ8utVqutOwjg0Y1b0pPh4uhEbGseinnZy/Em0ydmDbevRpVYsqAb4ABEXE8NmG/UXGz36qC0M6NODDtTv5ccdJi9VQUo1s2oBnWzfBz9WF4Jg43tm0k7NRMSZjhzaqy4AGtanm5wPA+RuxLP53n1H8gn7dGdSwjtHj9l66wvgfN1iuiHsY0qUhTz9RcO5dvBbHh6v/5UKY6XOpf8d69G5Tm8rlCs694CsxLF+3zxCv0ah5bnAbWjeoRNlSnqRn5nD0/FU++2Uv8ckZVqvpTn0nd2PoS73x9vcg7EwEy176jpBjYSZjK9Qqy6g5Q6jWqBL+Ff34fOZqNizdXCjOJ8CL8e+NoFmPBjg4OxB1OYYPJ3zJxRPhli6nMOenULmMB7Uf5AWjpL0NeWdMxzp0R+U6GTQVAC3orqJkfAvZfxhC1P4XTT5Un7oQMr+xQAE3n/dBHrRs2TIqVqyIo6MjLVq04MiRI+bOy6QO3esy8eWe/PDlLqaO/IKw0GjeWz4KDy8Xk/H1m1Zk5+YzvDphJS+N/pq46BTmfz4KHz83ABwc7ahaK4Afv97F1Cc/5+2Xf6ZcBV/mfTzSKvXcrZxrNxr4zuBC4ldsu/YUKTmhtA/4DAeNl8n4XH0qQUkr+DdyDFsjRhCe+hfNSs2htHMrADRqR7wcanIh6Ru2XXuKAzdm4mZfkTZlllizLIMOXeswaXp31nyzmymjviTsYgzzP30aTy9nk/ENmlRg15ZzvPLcd0x/9lviYlJYsPQZo+NXrYY/P6zYw5RnvmLea2sJLO/D2x89ac2yDLo3rc6MoR34auMhRr67hovX4lj24iC83JxMxjepUY7NR0KY+NE6xiz8iZjENJZPH4Sfp2uh2E4Nq1Kvchlik2zTLJmLrcaOXrWrM6t7e5btPsTAr34gODqeb58ahLez6WPTomI5/j4XzKjvf2XEip+5kZrGiqcHUcrNeKzZcymcNh99afiZ8ds/1iinkK4tajB9ZAe++f0go95azcWIOD59ZXDR517NQLYcCua5Bb/w7Ns/EZOQxtJXBuPnVXDuOdprqVGxNCv+OMQzb67mtU//pHwZbz56aYAVq7qtw5CWTFr0FGve+40pLd4g7GwE8zf+D08/d5PxDs4ORIfHsuKNn0m4kWQyxtXTmSU755Cfp+P1fouY0PBVvnrtB9Jt0TQ5PoHKbTZK+mco8QMgPwiV1wpQe5uOV5JR0j9HSRiGktAXJWs9Ko/3wb6tIUQf28r4J+V/KIoecrZYtJT7birWrl3LjBkzmDNnDidOnKBBgwb06NGD2NhYS+RnZNDTrdn823G2/nmSiLA4Pn3vL3Ky8+gxoLHJ+IWvr2fjuqOEhUZz7Uo8S97+A5VKRaMWlQHITM9h1nPfsWfbeSKvJhB8NpJl72+keu2y+Pl7WLyeu1X3fJrwlA1cSfuLtLxwjsfNR6dkU9Gtv8n4uKzjRGXsJC3vChn5kVxK+YmUnEv4OjYEIF+fzp6oqUSmbyM97yqJOec4GbcQb8faOGn9rVhZgcEjW7Lp9xNs3XiKiPB4Pnl/Y8Hx69vIZPz7b23gr/XHCLsYw7WrCSx576+C49esEgCZGTn87/k17Nl+gciIBILPXeezDzZRvVYAfqVNDzaW9FS3JmzYd44/D5wn/EYi7/2wnezcfPq3qWsy/o1vN7Fu92lCI+O4Ep3E299vQ6VS0bxmoFGcn6crrz7Zide/2US+TmeNUizClmPH2FaN+eXEOX47fYHL8YnM+Xs72Xn5DG5k+tjM3LCZH4+dITgmjrCEJN74axtqlYpWlcobxeXm64jPyDT8pGbnWLwWU0b2bMLvu86yce95wqMSeX/VNrJz8ujboZ7J+Le++If1O05zMSKOqzcSee/brajUKprVLqgvIyuX5xf9yvYjoUREJ3Hu8g0++H4HtSr5U9rHzZqlATD4xV5sWrGTrd/vISL4Op9MXUFOZg49RncwGR96PIyvZ/3ErnWHyMvJNxkzbGZf4iIT+GjiV4QcCyP6ShzHt5/lRpjlz8e7qZzHQeZayFoPuksoqW+BkgVOQ0w/IPcI5GwD3WXQRUDmd5Afgsq+6e0YfbzRj8qhC+QeAt01i9Zy303F4sWLmTBhAmPHjqV27dp88cUXODs7s2LFCkvkZ6DVaqhWqwwnDl82bFMUhZOHL1O7frli7cPB0Q6tVkNaSlaRMS5ujuj1ejLSsh865/uhQouXQ01isu785KYQk3kEH0fTA8PdSjk1w82+AnFZJ4qMsVO7oih68nTWvbyj1aqpVjOAk0dvT1cqCpw8Gkatevdz/NSkpd7j+Lk6oNcrZKRb9/hpNWpqlS/N4aCrhm2KAoeDrlK/cpli7cPRXotWoyE143buKhW8O64n3285RtiNBLPnbU22Gjvs1GrqlCnNgfAIwzYFOBAeQaNyxTs2TnZatGoNKVnG51XziuU48PIkNk8ZzdwnOuPp5GjO1ItFq1FTs2Jpjp6/oz4Fjl6IoF7VYp57Dlq0GrXRuXc3V+eC91Z6hnUbJ62dhmqNK3Hy33OGbYqicPLfc9RqWe2B99uqTxMungjnjR9f4Jdry1l++D16jetkjpTvkx3Y1UHJPXDHNgVyD6CyM/2BqxD7VqCphJJ71PTv1T7g0BEl69eHzva/3NeaitzcXI4fP86sWbMM29RqNV27duXgwYMmH5OTk0NOzu2TMDU19YESdfdyRqPVkJxoPDWVlJBBYEW/Yu3j2Re7kxCXxonDpq/D2dlrefaF7uzafJZMK79xHDSeqFVasnXGfziydQm42Vcs8nFatSt9K25CrbJHUXSciHuf2KzDJmPVKnvq+7xARPoW8hXrTvG5ezqj0apJuvv4JWYQWMG3WPsYP60rCfFpnDhS1PHTMH5aV3ZtPUtmRu5D53w/PF2d0GrUJKZmGm1PTMukYpkipjDv8sLgdsSlpHM46PYfhzE9mpGv1/PTv4/3Gor7HTvMNW4AeDk7oVWrScgwPjYJGZlU9jV9afFuM7u0IzYtnQNht4/N3stX2BZ8icjkFAK9PJnRuQ1fjxzI8BU/o1eUB873fnm63Tr3jN9biSmZVCjmuTdteHvikzI4cv6qyd/b22mYNqw9Ww8Fk5Ft3feWu68bGq2GpJgUo+1JsakE1gh44P2WqeRHn4ldWP/JJn5a+Ac1mlZmyuJR5Ofms23N3odNu/jUXqhUWhT9XevcdAlgX6Xox6lcUfntA5U9oEdJnQu5+03HOg0CJQOyLXvpA+6zqYiPj0en01G6dGmj7aVLlyY4ONjkYxYsWMC8efMePEMzGTa2HR171OWVCSvJyy08HabRqnl90TBQwdL5G22Q4YPJ12ew9dqTaFXOlHZuTgPfGWTkXycu67hRnAotrfzfB1SciF1gm2QfwvBRbejQrS6vPLeKvNzClwA0GjVvzB8KKhWfLvzbBhk+nDE9m9GjWU0mfvgLufkF9dUqX4onuzRm5LtrbJzdw7vfseNRGTcAJrRpxhN1azDqu3Xk3nH56Z/zoYb/HxqbQEhMPDteGEfziuU4FG7ZKWZzGtWnOd1a1OC5Bb+Qm2f6vTV/al9UKli4arsNMrQMlVpN6PEwVr71CwCXT1+lYp1Aek/oYt2m4kEpGSgJ/UDlAvatULnNQtFFFFwauYvKaTBk/QlYviG0+C2ls2bNIiUlxfBz7dqDvdlSkzLR5evw9DZeKOXl40JSwr2n8oc804bhY9sya8r3hF8svNpbo1Xz+sJhlC7jyaznvrP6LAVAji4ZvZKPo8bHaLujxofs/HvdqaGQkRdJSm4ooclriEzfQU2vsUYRtxoKZ20Z9kRNsfosBUBqcia6fD1edx8/bxcSE+69+HDIU60YProts15YTfilwtc7NRo1bywYQqkyHvzv+dVWn6UASE7PIl+nx9vdeNGpt5szCSn3fr2f6daEsT2bMeXj9Vy8fvtYN6pWFm83Z/55fwJHPp/Okc+nE+DrwUtDO7Bx/rMWqeNRYa5xAyApM4t8vR4fF+Nj4+PiTHx6ZhGPKjCuVRMmtmnKs2t+IyT23ndMRSankJiRSQUvzwfO9UEkp90694zfW94e/33uPdWrKaN7N+OFD9Zz6Vrh+jQaNQum9qGMrxvPL/rV6rMUAKnxaejydXiVNl7n5lXKncS7Zi/uR+KNZCKCjO8cjAi+TqlAnyIeYSH6JBQlH9R3zdhqfEAfd48HKgXrKfKDIHMFZG9G5TK5cJhdU1TaKihZ68yadlHuq6nw9fVFo9EQE2P8hzkmJgZ/f9ML/xwcHHB3dzf6eRD5+TouBt0wLLIEUKlUNGxemQtnIot83NDRbRk5oQOvT13NRRO3Lt5qKMqW9+F/k1fdc72FJSnkk5QTTCmnZndsVVHKuRkJ2WeLvR+VSoVaZXfHHgoaCle7QHZff45c/YO/CR9Gfr6ei8FRNGx25/GDhk0rE3T2HsfvmdY89Wx7Zr+4hotBNwr9/lZDUTbQh/9NXW2z45ev0xMUEUPzmrcX8qlU0LxWec6EFc77ltE9mjK+T0umfbKBoKvG76u/DwUx/O3vefKd1Yaf2KR0vt9yjKmf/GaxWizhfscOc40bAHl6PedvxNCq0u0FsCqgVaVATkYWfWzGt27KlHYtGP/DBs7dMH3r6Z1Ku7ni6exEXLp1m/Z8nZ7gKzE0q2N87jWtXZ6zl4qu75knmvFs/5a8+OFvBIWb+LB1s6EI9Pdi6sJfSbHyOqVb8vN0XDwRTsNOt2/fValUNOxUl6BDpm+bLI7zB0MpV914zUm5amWIibD27fZ5kHcelX2rO7apwL41St79XPZU37wUYkzlPBQl7yzkm76aYG731VTY29vTpEkTduzYYdim1+vZsWMHrVq1uscjzeO3NQcKvnuib0MCK/ny/Ow+ODrZs/WPgoWJr7wziLHPdzXEDxvTllFTOrN43u/ERCXj5eOKl48rjk4FL7xGq+bND4ZTvXZZFr7+K2q12hCj1WosXs/dQpPXUNl9IBXc+uBmV5HGfrPQqpy4kvYnAM1KzaOuzzRDfE2vsZRyaoGLtixudhWp7vk0Fdx6E5G2CbjVUCzEy6EWh2PeQKXS4KDxwUHjg8oGX1Gy/sdDPNG/Md16NyCwoi8vvNYHRyc7tmw8BcArcwcwbkoXQ/ywUW0YPakTH73zJzE3kvHyccHLxwVHp4KmSaNR8+b7Q6leK4D33/oNtUZliNFqrf+9bj9sO87AdvXo06o2lfy9mf1UV5zs7fhzf8H3jLw9tifTBt6+5Wt0j2Y81681877bSlRCCj7uzvi4O+PkUFBfSkY2l6MSjH7ydToSUjO4GmP6NrlHla3HjpUHTzCscT0G1K9NZV9v5vbugpOdHb+dKjg2C/v3YEbnNob4Ca2b8mLHVsz+cyvXk1PxdXHG18UZZ7uCY+NsZ8erXdvRoKw/ZT3caVkpkOXD+3E1MZm9l02vS7CkHzcfp3+HevRuW5uKAd68NrorTg52bNxTsLhx7sSeTBl6+9wb1bsZkwa35p1vtnAjPgUfD2d8PG6fexqNmvef70utSv689fk/aNQqQ4xWY/331vpPNvHEuE50e7odgTUDeOGzsTi6OLDl+90AvPLtZMa9M9wQr7XTULl+BSrXr4CdvRbfAC8q169AQJXbl99++3QTtVpUZcSr/QioUppOw1vzxLOd+OuLbVavT8lcAc7DwXEgaKqgcn8bVE4Fd4MAKo9FqFxfvv0Al0lg3wY0gaCpAs7jwKk/StYfxjtWuYJDT5RM68xSwAN8+dWMGTMYPXo0TZs2pXnz5nz88cdkZGQwduzY/37wQ9q99RweXs6Meq4zXj6uhIVE8/rU1YbFm37+Huj1txdI9R7aDHt7LW9+OMJoP6u/2MmaL3fi6+dOq461APh87VSjmFfGr+DM8SuWLegukenbcNB4Ucd7Mo5aH5JzQtkb9Tw5ukQAnO38KVi3XkCjcqSx3/9w1pZCp+SQmnuFwzFvEJle8KZw0vpR1rUjAN3L/2z0XLuuTyy07sLSdm8/X3D8JnYsOH6h0bz+4g+G41eqtAfKHcevz6Cm2NtreWvhMKP9rP56F6u/3o1vKTdad6gJwBc/GE/7zZy8ijMnrDu4bz0WipebM8/1a42PuzMhkXFM+/Q3EtMKptj9vd2MFvAN7VAfezstH07ua7SfL/86yJd/mV74/Diz5dix6UIo3i5OvNCxFX6uzgTFxDH+xw2GxZtlPIyPzYim9bHXalk6zPjYLN19kM92H0Kn6Kle2pcBDWrj5uhAbFo6+y9H8MmuA+TZ4Lbf7YdD8HJzYuKgNvh4OBMaEceLH6w3LBwu7eNuVN+gzg2wt9Oy8IV+Rvv5esMBvt5wkFJernRoXBWAH94bZRQzef5aTgQXPbtoCbt/PYSHnxuj3hqCl78HYaev8nrfhSTHFizgLRXoYzR2+AR48cXR+Yb/HjqjD0Nn9OH07gu80v09oOC203nDPmbcO8N5+vWBRF+J4/OZa/j35wNYXfY/KGpvVG4v3vzyqyCUpGdBf3PhviaAO8d+lcoZ3OeCxh+UbMgPQ0mZCdl3fU+KY++Caavsv6xWikpR7n+Z8meffcYHH3xAdHQ0DRs25NNPP6VFixbFemxqaioeHh50rvcqWo3DfSf8OBi/7vFbKHg/vh7Z77+DHnPxDa1/L7416HKzOfPd66SkpDzUJYUH9aBjx61xo8qs+WgcrX/bpjV4XNLbOgWL8lxb9K3uJcXmq9b5MjdrS03T41U9rFjjxgPNgU+bNo1p06b9d6AQQtxBxg4hSjb5B8WEEEIIYRbSVAghhBDCLKSpEEIIIYRZSFMhhBBCCLOQpkIIIYQQZiFNhRBCCCHMQpoKIYQQQpiFNBVCCCGEMAtpKoQQQghhFtJUCCGEEMIspKkQQgghhFlIUyGEEEIIs5CmQgghhBBmIU2FEEIIIcxCmgohhBBCmIU0FUIIIYQwC2kqhBBCCGEW0lQIIYQQwiykqRBCCCGEWUhTIYQQQgizkKZCCCGEEGahtdUThz7njNrJ0VZPb1FfVa9s6xQsKvRLJ1unYHHuwSpbp2ARupzHuy7nGAWNvWLrNCwiof7jfWz+y1fv7rF1ChbXI6ClrVOwiHwlDwgrVqzMVAghhBDCLKSpEEIIIYRZSFMhhBBCCLOQpkIIIYQQZiFNhRBCCCHMQpoKIYQQQpiFNBVCCCGEMAtpKoQQQghhFtJUCCGEEMIspKkQQgghhFlIUyGEEEIIs5CmQgghhBBmIU2FEEIIIcxCmgohhBBCmIU0FUIIIYQwC2kqhBBCCGEW0lQIIYQQwiykqRBCCCGEWUhTIYQQQgizkKZCCCGEEGYhTYUQQgghzEKaCiGEEEKYhdbWCdyvUTUbMbFuC/ycXAhKjGXO4e2cjr9hMnZEtQYMrlqHGp5+AJxNiGbRiT1G8c5aO/7XpAPdy1fHy8GRa+kprAw6zg8hp6xRTiH9pvRg6Mx+ePt7cvn0VZa9sIKQo5dMxvYa34Vuz3SgYt1AAC4eD2PF6z8Vih89bzi9xnfB1dOF8/uD+XTK11y/FG3xWkwZVbsRE+s3v338DmzndJzpXEbUqM/g6nWo4XXz+MVHs+joHqP4qxNeNfnY+Yd38eWZI+Yv4D+MaNOAMR2b4OvmQkhUHAs27OTctRiTsYNb1KVv09pU8/cB4EJkLJ/8s88o/t0R3enfrI7R4/YFX+G5rzdYrogSaliHBozu1hQfdxdCI+NYuHYn56+aPvcGtqlHn5a1qBrgC0BQRAxLf99vFD+pdyt6NK2Bv5cbeTodQRExfPbHfs5dsc176+mGDZjQrCl+Li4ExcUxb8dOzkSbzmV4vXoMrFOL6r4F9Z2LieHDvfsLxVfx9ubV9u1oEVgOjVrNpYQEpvzxFzfS0ixez918XUdTyn0SWo0fWblBXE96i8zcUyZjPZx6Utr9eRzsKgB25OaHE5v6FUmZvxnFOWirEuA5G1fHFoCWnLyLhMdPJE8XZfF67nY/Y3+F2uUYPW841ZpUxr9iKZa/tJINn/xjFPPMnKGMmjPMaFtE8HWerT3dUiUADzBTsWfPHvr27UtAQAAqlYrff//dAmmZ1qdiTd5o1plPTu2nz5+rCEqMZXW3Yfg4OpuMb+UfyJ9hQYzY8hMD/1lNVEYaq7sPo7SzqyHmzWad6VC2MtP3/kWX37/h2wvHeLtFN7oGVrVWWQYdhrVm0kejWfP2Op5r8hphZ66yYPPrePq5m4xv0KEOO3/exyud5/Fi69eJu5bA+1vewCfA2xAz/NX+DHi+F5889xXPt5xFdkYOCza/gZ2DnbXKMuhTuSZvtOzEJyf202fDdwQlxLG61z2OX0B5/rwUxIiNPzPwjzVEpaexupfx8Wu6ZpnRz8zd/6BXFP4JD7FWWQY9GlbnlX7t+WLrIYYt+YHQqHi+nDgIb1cnk/HNqpZj08lgxn3+K08v/Zno5DS+nDSIUu4uRnH7gsLpOPdLw89ra/4xub9HmS3HDYDuTarz8uAOfPn3IUbOX0NoZBzLXxiEl5vpY9O0ejk2Hw1hwpJ1jF70E9GJaXz+wiD8PG6fe1djk1i49l+Gvvs9Yz9cS1RCKstfGIxXEcfbknrXqM7sjh349OAh+q1eQ3BsHKuGDMLH2XQuLQLL8VdwCE+tXceQH3/iRloa3w0ZRGnX2/WV9/Bg7ZPDCUtMZOTaX+i96ns+O3iIXF2+tcoy8HTuS4DXm0SnfEzIjSfIyrtA5VKr0ap9TMbr9MnEpC4lNHoAIdHdScj4hfI+H+Hm2MEQY6+tQLXSv5Gdf4lLMcMIie5OdOonKEqOtcoyuN+x38HZgRvhsXw76wcSbiQVud/wcxEMKzPB8PNSuzctVYLBfTcVGRkZNGjQgGXLllkin3saX6cZP4eeZt2ls1xMSWD2wS1k5ecxrFo9k/Ev7t3I6pCTXEiM5XJKIq8d2IQaFW3KVDDENClVlvWXznEo+hqR6an8FHqaoMRYGvqWsVZZBoNf6sOmb3awZdUuIoIi+WTyV+Rk5tJjXGeT8e8/8yl/fb6Vy6evcC0kisUTvkClVtGoS11DzMAXe/PDe+s5+Ocxws9GsHD0Z/gEeNFmQDNrlWUwvl5Tfg4+w7rQc1xMTmD2vpvHr0YRx2/nRlYHnbp9/PZuRq1S0abs7eMXl5Vh9NOtQjUORkVwLS3FWmUZjGrfmPWHzvH70QuExSTy9vrtZOXlM7B5XZPx//thM2sPnCEkKo7w2CTm/LINtUpFi2rljeJydToS0jINP6lZ1h/0HpYtxw2Ap7s04bf95/jz4HnCohN576ftZOfmM6CV6WPz+spNrNtzmtDIOK7EJPH2mm2oVCpa1Aw0xGw+Gszh4Aiux6cQdiOBj37djZuTA9XK+lqrLINxTZuw9uw51p87z6WERN7YVnDuDalrur4Z/2zih1OnCYqLIywxiVlbCuprXf52fS+3a8OusHAW7tnLhdg4IlJS2HE5jITMLGuVZeDnNoGE9J9IzPiFnPyLRCbOQq/Pxtt1uMn49JxDpGRtJif/Ern5V4lPW0FWXhAuDrfHvTIer5Ka/S83kueTlXee3PyrpGZtI1+fYK2yDO537A89dpmvX13NrrUHyMvJK3K/+nw9STHJhp/UBMvPMN13U9GrVy/effddBg4caIl8imSnVlPPx599N64atinAvhtXaOxXtlj7cNLYYadWk5yTbdh2PPY6XctXNXz6beVfnkoeXuyJCjdr/v9Fa6elepPKnNh+xrBNURRObD9D7ZbVi7UPB2d7tHZa0hLTAfCvVAqfMl6c3H7WEJOZmknw4UvUblXDvAX8Bzu1mnq+/uy7fsWwTQH2Xb9K41IBxdqHk7bw8buTr5MznctXZm3IGZO/tyStRk3tcqU5dDHCsE1R4FBoBA0qFK9BdbTXotVoSMk0rq9plXLsmjuJP18bzRuDO+Ph7GjW3K3BVuMGFBybWuVLczj4jrFDgcPBV6lf+T6PTYbpc0+rUTOobT3SMrMJjYwzS97FZadWU7d0aQ5cNR4bD0RcpVFA8epz0mqxU2tIzi6oTwV0rFyZK0lJrBw8iCNTJrP+qSfpVrWKBSq4NxV2ONvXIz173x1bFdKz9+Ji36RY+3B1aIODtgrpOYcNe3V36kxOXjiV/dZQp+xJqpX+Ew+nHmbP/7+YY+wvSkA1f36O/JLvL33G/1a/gF+g5Rtei6+pyMnJISfn9ier1NTUB9qPl4MzWrWa+KwMo+3xWZlU8TA9BXa3WU07EJOZzv4bVwzb5hzezoLWPTgybCp5eh16ReF/BzZzJCbygfJ8UB6+bmi0GpJijD9hJ8WmEFizeE3T+IVPkxCVyImbTYS3v2fBPmKSjfcZk4xXac+HTfm+eDneOn6ZRtvjszKo4uldxKOMzWp+8/jd0ZjcaXC1umTk5rL5SujDpnvfvFyc0GrUJKQZ15eQnkmlUl7F2sdLvdsRl5Ju1JjsC77C9rOXuJ6QQqCvJy/0asPnEwby9Kc/o1cUs9bwKDHXuAHg5VpwbBJT7zo2qZlULF28c+/FgQXH5nBwhNH2dnUr8f6zvXG0tyM+NYPJn64nuYjGw1K8nJwK3lsZd723MjKp7F28+l7t0I6YjHT2Xy2oz8fZGVd7eya1aM7ifftZtGcv7StVZHn/fjy1dh1HIq03Pmo03qhUWvJ0xs1anj4eB7uiL1OrVW7UKXsUtcoeBR2RiW+Qnr0XAK3aF43alVLuU4hO+YAbyfNxc+pIRd+vuBQ7nIycQxat6U7mGPtNCT58kQ/HLuNaSBQ+Zbx4+q2hLNnzNhPqzSAr3XLnqMWbigULFjBv3jxLP81/eq5eC/pWqsXwzT+Ro9MZto+p1YRGfgGM2/4r1zNSaVE6kHdadrvZfFy9xx4fLcNfG0DH4W2Y2WnOPafDHlfPNWhB38o1Gf73z0bH707DatTj98sXivz9o+zZzs3o1agG45avIzf/dv6bT91ukC5GJxAaFc+m18fRrGo5Dl+8ZotUreJRGTcAxnZvRo+mNZmw5BejYwNwNPQaI+avwdPViUFt6rFofB+eWfQjSWnWv0TwoCY1b0afGjUZufYXcm++d9QqFQDbL11m5fETAATFxdE4IICRDepbtal4UHolnZDonmhUzrg6tqWs15vk5l8lPecQqAom6VOzthKX9g0AWXkXcLFviq/r01ZtKizl6OZThv8ffjaCoMMX+eHK53QY1prNK/612PNa/JbSWbNmkZKSYvi5du3BBsKknEzy9Xp8nYwXsfk6ORN31+zF3SbWac5z9Vry9NZfCE663e06aLS80rg97x79lx2RlwlOiuO74BNsDA9mYt3mD5Tng0qJT0OXr8OrtIfRdq9SHiRFJ9/zsUNe7suI1wYwq8c7hJ+9/Ukq8ebj7p6V8CrtWWj2wtKSsm8dP+NFmb5OLsRl/sfxq9eM5xq04OlN6whOND213My/HFU9ffg52PqXPgCSMrLI1+nxcTOuz8fVudDsxd1Gd2zCuM5Nmfjlb4TeiL9nbGRiConpmZT38XzYlB9p5ho3AJLSC46Nt/tdx8bdmYTUe597z3RtwtgezZjy6XouXi98bLJz87kWl8zZ8BvMW7MVnV7PwNam1zFYSlJWVsF7y+Wu95aLM3EZ965vfNMmTG7ejDG/rick/nZ9SVlZ5Ol0XEowXl9wOTGRAHc38yVfDDpdIoqSj53Gz2i7ndqXfN29LjUp5OZfISvvAnFpX5Gc+Q+l3Kfdsc88svMuGj0iO/8idtriXY41l4cZ++9HRkomkaFRBFT1N9s+TbF4U+Hg4IC7u7vRz4PI0+s5mxBttMhSBbQpU5ETcdeLfNykus15vkFrRm9bx9kE49ul7NRq7DUa9HfNIusUBTWqB8rzQeXn5RN6PIxGXW4vWlSpVDTqUo8Lh4qezh/2Sj+efmMIs3u9R+jxMKPfRYfHknAjyWjhprObEzVbVOXCQeveHZGn13M2PtpokaUKaBNQgROxRd++Nal+c55v3JrRm9dxNr7oW/WG16jHmbhogopoOiwtX6fnQmQMLardXuimUkHLaoGcvmr6lmeAsZ2aMqlrC577agMXIk3fenqn0h6ueDo7EZd27z8WjztzjRtQcGyCImJoUeP2AliVCprXKM+ZsKKPzehuTZnwREumfraBCxH/fWwK9qvCTmvdO/Xz9HrOxcTQuvwd9QGtypfnZFTR9U1s1pRprVoydv0GzsYY15en13M2OoZKXsaX7ip5eXE91bq3kyrkkZl7FlfHNndsVeHq2JaM3OP3sSc1apX9Hfs8jYNdZaMIB21l8vKL/ntiCQ869t8vRxdHylTxJ/Eed4uYw2P1PRXfnD/KR+16cyY+mtPxNxhXuynOWjvWXSxYQ7C4bW+iM9NYdGIPAJPrtmBGo7a8uOcvItNT8Ls5y5GRl0tmfh7pebkcjI5gdtOOZOvyuJ6eSgv/QAZXqcM7Ry03PVSU9Us28uqqqYQeu0zIkUsMnN4bRxcHtqzcCcCrq6YRH5XIitk/AgW3i46aN5wFT31C9JU4w4xEVno22Tev62745G9Gvj6Y6xejuREey5i3h5MQlcT/tXfn4U1V6QPHv0mTpk33haJAWURwYYe2QNkXkUUQQRbZRQQUUQbUURQVR36OooMbKqMCo4DDLgKCFhQQKCJLhW5AKVDa0r1N9zZt8vsjtRBIsdWbBJj38zw+jyTn3nte3puT9557bjjwza8Oj+/zk0d4t9dgTmSm8VvmJaa2DkGv1bL+dFX+eg8mraiQt3+tyl+7MOZ26s4zP24juSD/mvz9zlPrypBmd/HGL3scHtOVvtx3jEVj7yfmYgYnk9KY2LMD7q5avjkcA8CiR+4nw1DI+98dAGBqnxBmDezK31ftICU3v3qWo7jMSEm5EXdXLU8M6MKuE2fIKigmONCHuUN6kJSdx4H4m+fW3I1g1e6jvD55ILFJ6USfT2Nc346467RsibTk5h+TB5KRV8iHWyyLAacMCOWJB7oyf8UOUrMNBHhfkZsyI26uGqYN6szeE4lkGQrx9XRndK/2BPl6EnHM8Wt6lh85yuJBAzmZns5vl9J4tFNH9FotG6It8b0zaCBphYW887MlvulhocwJ78rftu8g2WAgUF8Vn9FIsdHy2frs1yO8P3QIvyancOjiRXo2a0rf5ncwbu06h8eXWfAZjQP+RXH5CYrLoqjn9RhqtTs5hZa+NA5YgrEijUuGtwAI8p5FcfkJyo0XUKlc8Xbvi7/HCC7mzK/eZ0b+MpoELqWw9BcKyyLxduuFj3t/EjJG2+yDPdV17NdoNTS5txEAWlcNgQ0DaN6uKSWFpaSetVx8TV88kUNbj5J+IZOABn5Mem0MpkoTP319wK6x1LmoKCwsJCHh8g9ynDt3jqioKPz9/WncuPF1tvzrtp2PJ8BNz9wO3ann7kFsTgaTItaRVWqZXm7g6Y2Jy9MOE+7ugM5Fw6d9rFecL4naz3tRlr/Y2Xu/5fmOvXi/x1B8dW4kF+Wz+NjPrHLCj1/tXXcQ33reTF44Br/bfDkbdZ75gxaRl2FZwBPUOBDzFdMqD8wcgKtOy6sbnrXaz5cL1/HVwvUArH17C24ebsxZNgNPXz3R++N5cdAip6y72JYYT4CbO3M7daee3oPY7Awm7VhfvXizgYe31eLDCfdU5e++4Vb7WXL0AO8du/zBGNr8HlQqFd8mxDokjpp8H3Uafw93Zt3flUBvPfEpmcz8bDPZhZb4bvf1wnxFfKPD2+Kq0bBkylCr/Xz8fSSf/HAIk8lEywaBDAu5F293HRn5hUSeSuKjnQcx3mTrRpw5bgD8cPQ0fp56nnggnABvPaeSM5n14SZyqm5N3ebvZXXujerZFlethnemW+fm022RLNseiclkpml9f4ZOb4WvhxuGolJiLqQx9d21JF5y/COJ20+dxl+vZ063cAL1euIyM3l0wyayi6vOPW/r+Ma3a4tOo+HjB63je/9gJB8cjATgh4QEFkTs4onOYbzStw+JuTnM2rKVoymO/2GovOKtaNT+3O4zr+rHr2JJzJhIhclyy8bVpaHlkZ4qapWeYL9FaF1ux2QupawigQvZz5BXvLW6jaFkJ8k586nvPYtGLq9TVnGWc1kzKCpz/AVXXcf+gAZ+fHp8cfWfRz87jNHPDuO3PTE82/c1AAIbBjB/zTN4BXhhyMwnen88T3edjyHrzy96rg2V2Vy3JeR79uyhT58+17w+efJkVq5c+Yfb5+fn4+PjQ6OPX0PtfvM9GlcbLacecXYX7Or0Msf/xoWjecc7/sfBHKGyrJS4pfMxGAx/6ZZCXSk1brSZuggX11tz3Mh3/NOaDrVx9BJnd8HunmvaxdldsIsKs5E9bKnVuFHnmYrevXtTxzpECPE/TsYNIf43yD8oJoQQQghFSFEhhBBCCEVIUSGEEEIIRUhRIYQQQghFSFEhhBBCCEVIUSGEEEIIRUhRIYQQQghFSFEhhBBCCEVIUSGEEEIIRUhRIYQQQghFSFEhhBBCCEVIUSGEEEIIRUhRIYQQQghFSFEhhBBCCEVIUSGEEEIIRUhRIYQQQghFSFEhhBBCCEVIUSGEEEIIRUhRIYQQQghFSFEhhBBCCEVIUSGEEEIIRWicdeC7F6WhUeucdXi72p4a5ewu2NWQ7k2d3QW7y+xxu7O7YBeV5WZnd+EvKfVT4aJTObsbdqGqvLlz80fGHpnm7C7YXcBDHs7ugl1UGEth65ZatZWZCiGEEEIoQooKIYQQQihCigohhBBCKEKKCiGEEEIoQooKIYQQQihCigohhBBCKEKKCiGEEEIoQooKIYQQQihCigohhBBCKEKKCiGEEEIoQooKIYQQQihCigohhBBCKEKKCiGEEEIoQooKIYQQQihCigohhBBCKEKKCiGEEEIoQooKIYQQQihCigohhBBCKEKKCiGEEEIoQooKIYQQQihCigohhBBCKEKKCiGEEEIoQuPsDtTVA5O68/CMvvjV8yIxLpVPXtnI6d+SbLYd+EgX+o0MpcldtwOQcPIiK9/abtU+fGBbhkwI5842wXj7eTBr4GISY1McEotN+vGoPKaBuh4Y4zEXvA7GE7bb6gag8pwJLk0ADVRewFz0BZRusdlc5f06Kv0jmPIXQfFKu4VwPQ9MCOfhab2q8neJT17/htMnLtpsO3BMGP2Gd6JJy9sASIhOYeW7O6zahw9ozZBxXbmzVUNL/oYuITEu1SGx2DKqbzsmDgohwMeDM0mZLF79EzHn0my2Hd6zDUO63UPzhoEAxJ1P5+ONB2ps/+Kkfozs04531/zE1xHH7RbDrWpc53ZM7dGJQE8P4tMyWbTtJ04mp9tsOyqkNcM63EuL+gEAxKZksCRif43tX32wH2PD2vLm9j18edA5uZnQoR3TOodQz8ODuIxMXt/1Eycu2T6XxrRrw/BW99CynuXci05L5919B65p3zzAn+d79SCscSNcVGoSsrOZtXkrlwoK7B7P1cbdEcpjLcIJdPMk3pDGG7/t4GSu7c/6qKYdebBxW1p4BwEQk3eJJTG7rdoH6Dx4tnV/ugU1x0vrxpHsC7wRtYMLRTkOiedqIwa2Z9yDofj7epBwPpMlX+wmLsF2/ob2b8OgXq1o1tiSv1OJ6Sxb/bNV+16dWzB8QDvual4fHy93psz7D2fOZ9o9jjrNVLz55puEhobi5eVFUFAQw4cP59SpU/bq2zV6Du3A9AXDWf3eTmYPeYdzcSm8sWomPgGeNtu37XIne7Yc44UxS5k7/D0yU/NYtOoJAur7VLdx07sS8+s5lr+51VFh1MxtMCqv+ZgLP8KcNRwq4lD5LQe1v+325jzMhZ9gzh6NOXso5pKNqHz+Ca7dr22ruw+07TFX2j5JHaHn4HZMnz+U1R9GMPvB9zgXn8obK6bh4+9hs33bsObs2RbFCxOWMXfUR2ReymPRyscJqO9d3cZN70rMkXMsX/ydo8Ko0X1hLfnb2F58tuUQE15bxemLmXw4bwR+Xu4223e6uxHfHzrFzLfW8+gbX5OeU8BHz46gnu+153PvjnfSuvntZOQW2jsMu3D22DGoTUv+PrgnS388xMilqzmVlsVnU0bg72E7N6HNGvHdiXimfLGBRz79L5cMBXw+ZQRB3teeq/3vbU674NtIz3debgbf3ZL5fXvx4YFDPLhyFfEZmawYPQJ/ve34woIbsS3uFBO+Xs+or77mUkEBK0ePoL7n5XOvsa8P/x0/hrM5OYxfs44HVnzJ0oOHKKuscFRY1QY1bMULbQawNH4vI35cxilDOp93m4C/Tm+zfVhgE7YnRzP55/8wds8XpJUY+KLbRILcvKrbLO0yhkYefjx56L+M+HEZqcUGlveYiLuL1lFhVesXfhezp/Rm+bpIpj73FQkXMvjXgofx9bYdX8dWwUTsj+fpV9cyY/4aMrIKWPLKwwT6X86fm5uWE/EpfPLVPkeFAdSxqNi7dy+zZs3i0KFDREREYDQaGTBgAEVFRfbqn5WHpvVmx9eRRKw/TNKZdD58cT1lJeUMGNPZZvu3n1nF9q8OkBibQvLZDN5//r+o1Srad29Z3ebHTUdY8/73HN9/2iExXI9KPxWK10LJRqhMwJz/CphLwP1h2xuUH4ayCKg8C5VJUPwfqDiFyjXEup26PirvVzAb5gKOHxB+99DUnuxY+wsRG4+QlJDBhws2UVZiZMCoMJvt3573NdtXR5IYl0pyYibvz19vyV/XFtVtfvzmGGs+2sXxA2ccFUaNxg/oxDf7otm6P4ZzqTm8+eUuSssrGNajtc32C/69gw0//cbpi5lcSMvljRURqFQqwu4NtmpXz9eT58b3YcGyHVRUVjoiFMU5e+yY3K0j649Es/lYLGczc3htyy5KjRWM6GQ7N8+v38nXv5wg/lIm57JyWbA5ArVKRdc7Glu1C/L24KUH+vD8up1Ozc3U0E6s/S2ajSdjSMjOYcH3uygxVjCqje345m3bwerjvxGXkUliTi7zd1TF1+TyuTe3Zzf2nj3H23t+JjYjk6Q8A7sTEskpLnFUWNWmtOjC+vPH2HQhirMFWbx6fBullUZGNulgs/1zRzbzdeIR4g3pnCvM5uWjWy3xBTUDoKmnP+0Dgll4fDvRuamcK8zmtePbcFNrGRJs++/MnsYMDWHrrpN891M055OzWbwsgrIyIw/0s92Xhe9/x+bvozhzPpOklBz++cn3qFUqQtpcPj+/3xvLivWR/HrigqPCAOpYVOzcuZMpU6bQqlUr2rVrx8qVK0lKSuLo0aP26l81jdaFFm0aEXXFl7/ZbCZq/2nu6di0VvvQubviolVTkOeYgaxutKBthbn84BWvmaH8ICqt7Q/ONVy7gkszzOW/XvGiCpXPYsxFn0NFgpIdrhON1oUWrRsSdcWXv9lsJurgGe7p0KRW+9C5u+KicaHAUGyvbv5pGhc1dzetzy8xlz/AZjMcjr1A2ztvr9U+3HQaNC4uGIpKq19TqeD16QP5aucRElOzFe+3ozhz7NC6qGnVoD6RCZdve5rNEJmQRPvGtcyNtio3Jda5eevhgSz/+SgJGc7LjVatpvVt9Tlw4YpzDzh4/gIdGtYuPnetBo3aBUOpJT4V0PuOOziXm8uK0SP45amZbJj4CP1bNLdDBNenValp5duAgxmJ1a+ZgciMRNr7N6rVPtw1WjRqNYZyS0Hkqrbc+S8zXb7IMgPlpgo6BTS2tQu70WjU3NW8vtWXv9kMR04k0bplg1rtw81Vg8ZFTX5h6R83trO/tFDTYDAA4O9fw/Q8UFZWRn5+vtV/f4a3vwcuGhdys6zv5eVmFeBXz7uGraxNfXEoOen5N8SsxDXUfqhUGjBlWb9emW1ZX1ETlSeqoChU9WNR+X2GueAfUH7g8vse04FKyyyGE3n7VeUv23qKODerEL9Arxq2sjb1+cHkZOTfELMSV/P1ckfjoiYn37rgyTEUE2BjytyW2aN6kJVXyOGYy19+kweHUllp4r+32BqKPxo7lBo3AHz1ltxkF1rnJruwmEBP29PLV3t2YA8y8gs5ePZybqb1CKXSZOarSOfmxk/vjkatJrvIOr6s4mICPWp37j3fqwcZhYUcOG+JL8BDj6fOlRmdw9iXeJ4p6zYScTqBjx8aRlhw7b7IleKn01viK7O+GMwqKyLQzfat76vNa92fjJKC6sIksSCLlOI85rbqh7fWDa1KzbSW3bhd70O9Wu5TKdVjx1UXuzmGIvx9a5e/Jyb2Iiu3iCMOnpWw5U8v1DSZTMyZM4du3brRunXN00VvvvkmCxcu/LOHUcyoJ/vRa1gHnh/9EcYy590CUJy5CHP2MFB5gGtXVF4vYq5Mstwa0bRCpZ+MOXu4s3v5l42a0YdeQ9rz/PhPMZbfQvmrMnlwKAPC7mbGW+sor7BMo9/dJIix93VkwmurnNw7ZdVm7LhRxg2AaT1DGdTmLiZ/vr46N/c2CGJieAdGLl3t5N79dTM6hzLknrsZ//U6yqtu4ahVKgB2JZxlxZFjAMRlZNKxYQMead+WwxeTndbfunq8ZTcGN2rNpH0rKTdZ4qswm3j60Dre6DiMw0P/ToXJRGRmInvTzqBycn/rasJDYfTvdhdPvbqWcqPzb4/+6aJi1qxZREdHs3///uu2e/HFF5k7d271n/Pz8wkODr7OFrbl5xRRWVF5zVWtX6AXuZnXv4oZOb0Po5/oz/zxH3M+/lKdj+0QplzM5gpQB1q/7hIApuut2DVb1lMAVMSBpjkqj5mYyw+DayioA1DV21vdWqXSgNcL4DEZc2Yf5eOoQX5uVf6uWlTrF+h5zezT1UY+1ovRM/owf9K/OX/qxsxfXkEJFZUm/K9aWOXvoyc7//q32yYM7MSUIaE8uXgjCcmXZ6o6tGyIv5eebe88Xv2axkXNnLG9eGRAR4Y994WyQThIbcYOpcYNgLxiS24CrpqVCPDUk1V4/Vtpj3bvxOM9Q5i6YhOn0y/nJqRpQwI89Pz43LTq1zQuap4f1JNJ4R3o/87yP9XXPyO3uIQKk4kAD+v4AvV6sv5gzcpjYZ2Y0SWUSWs3cirzcny5xSUYKytJyLK+rZOQnUNIo9pNySslt6zYEp/O+qo9UOdBVun1F8dObdGVx1t2Z+r+Lzmdn2H1XkzeJR76cRmeGh1atQu55cWs7f0Y0bmOHWOqx46rZiX8fTyumb242iPDQpjwUBhzFq7n7IWs67Z1lD9VVDz11FNs27aNffv20ajR9afCdDodOp3uT3XuShXGSs6cTKZ9txZE/nASAJVKRftuLfn2Pz/XuN3DM/sy9qn7eHnip5yp4dHFG4MRjDGoXLtiLttV9ZoKXMMxF39Vh/2oQeVq+d+SbzBfeSsEwG85lGzBXLJRiU7XWoWxkjPRKbQPv5PIXTFAVf7C7+Tbrw7WuN3Dj/dm7JN9efnRzzkTfeNeHVVUmog/n07YvY3Ze/wsYLnnHnpPY9btjqpxu0mDQpj6QGeeencTceetH1f87mAch2OtH5f+cN5IvjsYy9b9MYrH4Ai1HTuUGjcAjJUmYlLT6dI8mN1xl3PTpXkwqw/9VuN2j/UIYUbvMB5fuYmYFOvcfHs8zmqNBsBnj47g2+NxbDrm2NwYTSai09IJb9KYXWeq4gPCmzbmq6NRNW73eFgIT4Z35tF1m4hOs47PaDJxMi2dO/z9rF5v5u9HSr5jHyc1mk3E5KXSNegOdl+yPDGkAroE3cHqs4dr3O6xFuHMvLsH0/avIjqv5kKhsKIMgCYe/rT2a8AHsT8p2v8/UlFh4tTZdELaNObnw5Z1byoVdGrbmI07ar61Nu7BUCaP7MLcf2wg/qztR52doU5FhdlsZvbs2WzevJk9e/bQrFkze/XLps2f72Heu+M4c/Iip6KSGP5YL3R6VyLW/QLAvCXjyU4zsPKtbQCMeqIfE+cO4q2nvyQ9OQe/epZZjpKiMkqLywHw9NET1NCv+jHFRs0tzzXnZuaTm+nYD4+5eDkqn7fBGA3GE6g8poDK3fI0CFjeq0zHXPiuZQOPGZa2lUmAK+h6gfuDmPNfrdphHlTkXXWUCsymLKg855igrrB5+T7mLR7DmZPJnDpxkeFTeqBzdyVig2Vh6bzFY8lON7DynR0AjJrem4lz7uetv60hPTm3epaqpPjK/LkT1MCPgKCq/DWzrD/JzSz4wxkQpa3+4SivTRtI7Pl0YhLTGDegI+46bXUBsHDaQDLyClm6wXKFPnlwKDOGd+XlZTu4lGUgoGqWo7jMSEmZEUNRqdWiTYCKykqyDUVcSMt1aGx/lbPHjv8cOMabI+8nOiWDk8lpTArvgLurls1HLbn558P3k55fyJIfLEX4tB4hzO7flWfX7SAlN7967UVxuZHiciN5JaXklVybm6zCIs5nOT43y389yuIhAzmZls6JS2lMCemIu1bLhpOW+BYPGUh6QSHv7LOce9M7hzKne1f+tnUHyQYDgR5XxGc0AvDZL0d4/8Eh/JqcwqELF+l5R1P63nkH49esc3h8K88c4p8hw4nOTeVEbgqT7+yCu4uWTReiAPhnp+FklBbwr5jdAExr2Y2n7+nNs79uIqU4j8CqWY7iinKKKy3x3d/wXnLLikgtNtDSpz4vtR3I7tR4DlyxINRR1m49wkuzBxF/Np3YM5cY/UAn3HRatv8YDcDLsweRlVPIp6stF9Djh4cxbWw4C9/bzqVMA/6+lvyVlBopKbXE5+Xpxm2BXtWPmTZuYFm/lJ1XRE6e/Ra716momDVrFmvWrGHLli14eXmRlmb5zQMfHx/c3W0/D62kfVuP4+PvwYS5g/Cv583Z2BQWTFxGXpZlCiyogR9mk7m6/ZAJ3dDqNLy8bKrVflYt2cnqJTsB6HJfa+b9a1z1ey8unXxNG4cp/Q6z2h+V1zNVP34Vhzn3MTBVTUG6NMCyRtlCpdKD92vgchuYS6EiEbPhWSh1/m822LLvu9/wCfBgwpz78a/nxdnYVBZM/Zy87N/z52udv3Fd0bpqeHnpJKv9rPrgB1Z/EAFAl36tmPf2mOr3XvxgwjVtHCXi8Gn8vPTMHB5OgI+e00mZzP7XpurFm7cFeGEyX45vZJ+2uGo1vP3UUKv9/PubSP69JdKhfbc3Z48dO06exs/Dnaf7dSXQS0/cpUymr9xcvbjxdh/r3Izt3BZXjYYPxlnn5qPdkSz98ZDd+1tX38WfJkCvZ073cOp56InNyGTquk1kF1via+BtHd+4Dpb4lj5kHd8H+yP54IDl3Is4k8Ar3+9iZpcwFvTrQ2JODk9t3srRFMf/uNyOlBj8dXpm39ubejpP4gxpPH5gdfXizQZ6H8xXjI2PNAvB1UXDB11GW+3no7g9fBRnuR0c5ObJC20GEODmSWZpAVuSTvBJ3F6cYffBU/j66Jk2thv+vnrOnMtk3hsbyK160q1+oDfmK/L30P3tcNVqWPTcg1b7+WLtQZavs8z89ghtzktPDap+7/V5Q69pYw8q85U9/aPGKttLWFasWMGUKVNqtY/8/Hx8fHzo33AmGrUy05s3mu2Htzu7C3Y1pPtwZ3fB7jJ71O5RvJtNZXkpUWtewmAw4O1du6emlPBXx47fx40W8/4PF52bwr27MRi9az0U35Q0LRz/K5yOFrC6dk9r3GwqjKUc3rqgVuNGnW9/CCFEXcnYIcT/BvkHxYQQQgihCCkqhBBCCKEIKSqEEEIIoQgpKoQQQgihCCkqhBBCCKEIKSqEEEIIoQgpKoQQQgihCCkqhBBCCKEIKSqEEEIIoQgpKoQQQgihCCkqhBBCCKEIKSqEEEIIoQgpKoQQQgihCCkqhBBCCKEIKSqEEEIIoQgpKoQQQgihCCkqhBBCCKEIKSqEEEIIoQgpKoQQQgihCCkqhBBCCKEIjaMPaDabAagwlTv60A6TX2BydhfsqsJU5uwu2F1leamzu2AXlUZLXL9/Dm8Wv/e3suzWzAuAqfTmykldVRbfurn7XYXRxdldsIu6jBsqs4NHl+TkZIKDgx15SCHEVS5evEijRo2c3Y1ak3FDCOerzbjh8KLCZDKRmpqKl5cXKpXK7sfLz88nODiYixcv4u3tbffjOZrEd3NzdHxms5mCggIaNGiAWn3z3P2UcUNZEt/N7UYeNxx++0OtVjvlCsnb2/uWPLl+J/Hd3BwZn4+Pj0OOoyQZN+xD4ru53Yjjxs1zqSKEEEKIG5oUFUIIIYRQxC1fVOh0Ol599VV0Op2zu2IXEt/N7VaP72Z1q+dF4ru53cjxOXyhphBCCCFuTbf8TIUQQgghHEOKCiGEEEIoQooKIYQQQihCigohhBBCKEKKCiGEEEIoQooKIYQQQihCigohhBBCKEKKCiGEEEIo4v8B4LA+6OUwM1YAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 4 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plt.subplots() 用于创建子图网格，其维度基于 outputs.attn_scores.shape[:2]。子图的行数和列数似乎由 outputs.attn_scores 的前两个维度确定。\n",
    "fig, axis = plt.subplots(*outputs.attn_scores.shape[:2])\n",
    "for i in range(query.shape[0]):\n",
    "    for j in range(outputs.attn_scores.shape[1]):\n",
    "        # axis[i, j].matshow(outputs.attn_scores[i, j].detach().numpy())：此行使用 Matplotlib 的 matshow 绘制每个 i 和 j 的注意力分数热图。detach().numpy() 将 PyTorch 张量转换为 NumPy 数组以进行可视化。\n",
    "        axis[i, j].matshow(outputs.attn_scores[i, j].detach().numpy())\n",
    "        for x in range(outputs.attn_scores.shape[2]):\n",
    "            for y in range(outputs.attn_scores.shape[3]):\n",
    "                # axis[i, j].text(y, x, f\"{outputs.attn_scores[i, j, x, y]:.2f}\", ha=\"center\", va=\"center\", color=\"w\")：此代码在热图上叠加文本，显示 (x, y) 位置处的注意力分数。格式化部分 f\"{outputs.attn_scores[i, j, x, y]:.2f}\" 确保以两位小数显示注意力分数。文本以白色居中显示在 (y, x) 坐标处。\n",
    "                axis[i, j].text(y, x, f\"{outputs.attn_scores[i, j, x, y]:.2f}\", ha=\"center\", va=\"center\", color=\"w\")\n",
    "fig.suptitle(\"multi head attention without mask\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:25.525550800Z",
     "start_time": "2024-08-05T08:06:24.814755500Z"
    },
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2025-02-07T01:56:07.538627Z",
     "iopub.status.busy": "2025-02-07T01:56:07.538375Z",
     "iopub.status.idle": "2025-02-07T01:56:07.784285Z",
     "shell.execute_reply": "2025-02-07T01:56:07.783777Z",
     "shell.execute_reply.started": "2025-02-07T01:56:07.538606Z"
    },
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "--------------------------------------------------\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAhUAAAG6CAYAAAC/RrTYAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAhtZJREFUeJzt3Xd4FOX2wPHvlvTeSAgk9CItQgIh9KZ0pQlYKSIW0IvYLupPwIZdULh2wIuidFEUEJBepHdCLyGQ3nuyO78/EjZssoEEZ3ch93yeZx9l9p3Zc/adOZydnVk0iqIoCCGEEEL8Q1p7ByCEEEKI6kGaCiGEEEKoQpoKIYQQQqhCmgohhBBCqEKaCiGEEEKoQpoKIYQQQqhCmgohhBBCqEKaCiGEEEKoQpoKIYQQQqhCmgpxWxo9ejR169at1Nhp06ah0WhuOq5bt260aNHiH0amrrp16zJ69Gh7h2EzVZnX20Fl963rxyYlJVk5KusbPXo07u7u9g5D3IGkqRB3hJycHKZNm8amTZvsHcpt7d133+WXX34pt3zHjh1MmzaNtLQ0q8dw5coVpk2bxsGDB63+WvZQ0XsshJCmQtwhcnJymD59usWm4vXXXyc3N9f2Qd2GbtRUTJ8+3WZNxfTp0y02Fd988w0nT560egxqsbRvSVMhRMX09g5AiH9Kr9ej18uufCdwcHCwdwhVIvuWEFUjZypEpV37zvjUqVM88sgjeHl5ERAQwP/93/+hKAoxMTHcf//9eHp6EhQUxMcff2y2/vz589FoNFy4cMFs+aZNm9BoNBV+tXHhwgUCAgIAmD59OhqNBo1Gw7Rp08ziqqzjx4/TvXt3XF1dqVWrFh988EG5Mfn5+UydOpWGDRvi5ORESEgIL7/8Mvn5+Wbj5s2bR48ePahRowZOTk40a9aML774otz2FEXh7bffpnbt2ri6utK9e3eOHTtW6Zg/+ugjOnTogJ+fHy4uLoSHh7N06VKzMRqNhuzsbL7//nvTezR69GimTZvGSy+9BEC9evVMz10/Dz/88APh4eG4uLjg6+vLyJEjiYmJMdv+tWtSbvT+bdq0ibZt2wIwZswY02vNnz8fsHxNRXZ2Ni+88AIhISE4OTnRpEkTPvroI8r+A8oajYaJEyfyyy+/0KJFC5ycnGjevDlr1qy54XunKAr+/v5MnjzZtMxoNOLt7Y1OpzM7e/P++++j1+vJysoCyu9bFb3H10tLS2P06NF4e3vj5eXFmDFjyMnJuWGMUPr+Hj58mK5du+Lq6krDhg1N87x582YiIyNxcXGhSZMmrF+/3mz9ixcv8swzz9CkSRNcXFzw8/PjgQceKHe8FRYWMn36dBo1aoSzszN+fn506tSJdevW3TC+gwcPEhAQQLdu3UzvjxBlSVMhqmzEiBEYjUbee+89IiMjefvtt5k5cyb33HMPtWrV4v3336dhw4a8+OKLbNmy5R+/XkBAgOkv6sGDB7NgwQIWLFjAkCFDqryt1NRU+vTpQ1hYGB9//DFNmzbllVdeYfXq1aYxRqOR++67j48++oiBAwfy+eefM2jQID799FNGjBhhtr0vvviCOnXq8Oqrr/Lxxx8TEhLCM888w5w5c8zGvfHGG/zf//0fYWFhfPjhh9SvX597772X7OzsSsU9a9YsWrduzZtvvsm7776LXq/ngQce4PfffzeNWbBgAU5OTnTu3Nn0Hj355JMMGTKEBx98EIBPP/3U9Ny1Ru2dd97hscceo1GjRnzyySdMmjSJDRs20KVLl3Jfl9zs/bvrrrt48803ARg/frzptbp06WIxL0VRuO+++/j000/p06cPn3zyCU2aNOGll14yawKu2bZtG8888wwjR47kgw8+IC8vj6FDh5KcnFzhe6fRaOjYsaPZvnj48GHS09MB2L59u2n51q1bad26dYUXKVb0Hl9v+PDhZGZmMmPGDIYPH878+fOZPn16hfFdLzU1lQEDBhAZGckHH3yAk5MTI0eOZNGiRYwcOZJ+/frx3nvvkZ2dzbBhw8jMzDStu2fPHnbs2MHIkSP57LPPeOqpp9iwYQPdunUza2qmTZvG9OnT6d69O7Nnz+a1114jNDSU/fv3VxjXnj176NGjB61bt2b16tVyEaeomCJEJU2dOlUBlPHjx5uWFRUVKbVr11Y0Go3y3nvvmZanpqYqLi4uyqhRo0zL5s2bpwDK+fPnzba7ceNGBVA2btxoWjZq1CilTp06pj8nJiYqgDJ16tQK47qZrl27KoDy3//+17QsPz9fCQoKUoYOHWpatmDBAkWr1Spbt241W//LL79UAGX79u2mZTk5OeVep3fv3kr9+vVNf05ISFAcHR2V/v37K0aj0bT81VdfVQCz96giZV+noKBAadGihdKjRw+z5W5ubha39+GHH1p87y9cuKDodDrlnXfeMVt+5MgRRa/Xmy2v7Pu3Z88eBVDmzZtXLo6y8/rLL78ogPL222+bjRs2bJii0WiUM2fOmJYBiqOjo9myQ4cOKYDy+eefl3utsvnrdDolIyNDURRF+eyzz5Q6deoo7dq1U1555RVFURTFYDAo3t7eyvPPP29az9K+VdF7fG3s2LFjzZYPHjxY8fPzu2F8ilL6/i5cuNC0LDo6WgEUrVar7Nq1y7R87dq15d5jS/vizp07y81ZWFiY0r9//xvGMmrUKMXNzU1RFEXZtm2b4unpqfTv31/Jy8u7aR7if5ucqRBVNm7cONP/63Q6IiIiUBSFxx9/3LTc29ubJk2acO7cOXuEWCF3d3ceeeQR058dHR1p166dWZxLlizhrrvuomnTpiQlJZkePXr0AGDjxo2msS4uLqb/T09PJykpia5du3Lu3DnTJ+H169dTUFDAs88+a3YqfdKkSZWO+/rXSU1NJT09nc6dO9/w02VlLF++HKPRyPDhw81yDQoKolGjRma5QuXev6r4448/0Ol0PPfcc2bLX3jhBRRFMTuDBNCrVy8aNGhg+nOrVq3w9PS86et37twZg8HAjh07gOIzEp07d6Zz585s3boVgKNHj5KWlkbnzp1vKZdrnnrqqXKvnZycTEZGxk3XdXd3Z+TIkaY/N2nSBG9vb+666y4iIyNNy6/9//V5X7+PFBYWkpycTMOGDfH29jbbT7y9vTl27BinT5++aTwbN26kd+/e9OzZk+XLl+Pk5HTTdcT/NmkqRJWFhoaa/dnLywtnZ2f8/f3LLU9NTbVlaDdVu3btctdf+Pj4mMV5+vRpjh07RkBAgNmjcePGACQkJJjGbt++nV69euHm5oa3tzcBAQG8+uqrAKam4uLFiwA0atTI7HUDAgLw8fGpVNyrVq2iffv2ODs74+vra/pK6Npr3KrTp0+jKAqNGjUql++JEyfMcoXKvX9VcfHiRYKDg/Hw8DBbftddd5mev17Zfa+yr9+mTRtcXV1NDcS1pqJLly7s3buXvLw803OdOnW6pVwqivHaHFfmPbL0/np5eRESElJuWdlt5ubm8sYbb5iuTfH39ycgIIC0tDSz/eTNN98kLS2Nxo0b07JlS1566SUOHz5cLpa8vDz69+9P69atWbx4MY6OjjeNXwi5rFlUmU6nq9QywOxiu4oupjQYDOoEVgmVidNoNNKyZUs++eQTi2OvFfizZ8/Ss2dPmjZtyieffEJISAiOjo788ccffPrppxiNRlVi3rp1K/fddx9dunThP//5DzVr1sTBwYF58+axcOHCf7Rto9GIRqNh9erVFt+bst+dV+b9s6ZbfX0HBwciIyPZsmULZ86cIS4ujs6dOxMYGEhhYSF///03W7dupWnTpqZrTWwd443Wrcw2n332WebNm8ekSZOIiorCy8sLjUbDyJEjzfbFLl26cPbsWVauXMmff/7Jt99+y6effsqXX35pdhbSycmJfv36sXLlStasWcOAAQNuGr8Q0lQIm7n2ia3sxX9lP41aUpW7O/6pBg0acOjQIXr27HnD1/3tt9/Iz8/n119/Nft0WvYrgzp16gDFZwXq169vWp6YmFipT6/Lli3D2dmZtWvXmp1+njdvXrmxFcVb0fIGDRqgKAr16tUznYn5p6oyV3Xq1GH9+vVkZmaana2Ijo42Pa+Wzp078/7777N+/Xr8/f1p2rQpGo2G5s2bs3XrVrZu3VqpvzhtuS9WxdKlSxk1apTZXVd5eXkWf5vE19eXMWPGMGbMGLKysujSpQvTpk0zayo0Gg0//vgj999/Pw888ACrV6+mW7duNshE3Mnk6w9hM9e+C7/+KnyDwcDXX39903VdXV2B8g2JNQwfPpzY2Fi++eabcs/l5uaa7ti49unx+k+L6enp5f6y79WrFw4ODnz++edmY2fOnFmpeHQ6HRqNxuyMzoULFyz+AJObm5vF98jNzQ0o//4NGTIEnU7H9OnTy32SVhTlhndVVKSi17KkX79+GAwGZs+ebbb8008/RaPR0Ldv3yq/fkU6d+5Mfn4+M2fOpFOnTqbm4NqdHFeuXKnU9RQVvcf2ptPpys3h559/Xu5MYNk5dXd3p2HDhuVul4bia2aWL19O27ZtGThwILt371Y/cFGtyJkKYTPNmzenffv2TJkyhZSUFHx9ffn5558pKiq66bouLi40a9aMRYsW0bhxY3x9fWnRooVV/i2PRx99lMWLF/PUU0+xceNGOnbsiMFgIDo6msWLF7N27VoiIiK49957cXR0ZODAgTz55JNkZWXxzTffUKNGDa5evWraXkBAAC+++CIzZsxgwIAB9OvXjwMHDrB69epy16FY0r9/fz755BP69OnDQw89REJCAnPmzKFhw4blvgsPDw9n/fr1fPLJJwQHB1OvXj0iIyMJDw8H4LXXXmPkyJE4ODgwcOBAGjRowNtvv82UKVO4cOECgwYNwsPDg/Pnz7NixQrGjx/Piy++WKX3r0GDBnh7e/Pll1/i4eGBm5sbkZGR1KtXr9zYgQMH0r17d1577TUuXLhAWFgYf/75JytXrmTSpElmF2X+U1FRUej1ek6ePMn48eNNy7t06WK6ZbkyTUVF77G9DRgwgAULFuDl5UWzZs3YuXMn69evx8/Pz2xcs2bN6NatG+Hh4fj6+rJ3716WLl3KxIkTLW7XxcWFVatW0aNHD/r27cvmzZtvu39DR9xG7HDHibhDXbtlLjEx0Wz59befXa9r165K8+bNzZadPXtW6dWrl+Lk5KQEBgYqr776qrJu3bqb3lKqKIqyY8cOJTw8XHF0dDS7vbQqt5SWjaei1yooKFDef/99pXnz5oqTk5Pi4+OjhIeHK9OnT1fS09NN43799VelVatWirOzs1K3bl3l/fffV+bOnVvu9k2DwaBMnz5dqVmzpuLi4qJ069ZNOXr0qFKnTp1K3VL63XffKY0aNVKcnJyUpk2bKvPmzbOYd3R0tNKlSxfFxcWl3O2qb731llKrVi1Fq9WWi2/ZsmVKp06dFDc3N8XNzU1p2rSpMmHCBOXkyZO39P6tXLlSadasmaLX681ufbQ0NjMzU3n++eeV4OBgxcHBQWnUqJHy4Ycfmt1+qyjFt5ROmDCh3OtX9j1UFEVp27atAih///23adnly5cVQAkJCSk3virvcUXHR0W3UpdV0ftbp04di7eAln0/UlNTlTFjxij+/v6Ku7u70rt3byU6Orrc+/P2228r7dq1U7y9vRUXFxeladOmyjvvvKMUFBSYxlg6ppOSkpRmzZopQUFByunTp2+Yi/jfpVEUG11hJYQQQohqTa6pEEIIIYQqpKkQQgghhCqkqRBCCCGEKqSpEEIIIYQqpKkQQgghhCqkqRBCCCGEKqSpEEIIIYQqpKkQQgghhCqkqRBCCCGEKqSpEEIIIYQqqnVTMWfOHOrWrYuzszORkZHV6l/Y27JlCwMHDiQ4OBiNRmPxX6y8U82YMYO2bdvi4eFBjRo1GDRoECdPnrR3WKr54osvaNWqFZ6ennh6ehIVFcXq1avtHZa4TnWtHdW5boDUjttBtW0qFi1axOTJk5k6dSr79+8nLCyM3r17k5CQYO/QVJGdnU1YWBhz5syxdyiq27x5MxMmTGDXrl2sW7eOwsJC7r33XtM/OX6nq127Nu+99x779u1j79699OjRg/vvv59jx47ZOzRB9a4d1blugNSO24K9/0Uza2nXrp3Zv+BnMBiU4OBgZcaMGXaMyjoAZcWKFfYOw2oSEhIUQNm8ebO9Q7EaHx8f5dtvv7V3GEL536kd1b1uKIrUDnuolmcqCgoK2LdvH7169TIt02q19OrVi507d9oxMnEr0tPTAfD19bVzJOozGAz8/PPPZGdnExUVZe9w/udJ7ahepHbYnt7eAVhDUlISBoOBwMBAs+WBgYFER0fbKSpxK4xGI5MmTaJjx460aNHC3uGo5siRI0RFRZGXl4e7uzsrVqygWbNm9g7rf57UjupDaod9VMumQlQfEyZM4OjRo2zbts3eoaiqSZMmHDx4kPT0dJYuXcqoUaPYvHnzbVUchLiTSe2wj2rZVPj7+6PT6YiPjzdbHh8fT1BQkJ2iElU1ceJEVq1axZYtW6hdu7a9w1GVo6MjDRs2BCA8PJw9e/Ywa9YsvvrqKztH9r9Nakf1ILXDfqrlNRWOjo6Eh4ezYcMG0zKj0ciGDRtuq++ehGWKojBx4kRWrFjBX3/9Rb169ewdktUZjUby8/PtHcb/PKkddzapHfZXLc9UAEyePJlRo0YRERFBu3btmDlzJtnZ2YwZM8beoakiKyuLM2fOmP58/vx5Dh48iK+vL6GhoXaM7J+bMGECCxcuZOXKlXh4eBAXFweAl5cXLi4udo7un5syZQp9+/YlNDSUzMxMFi5cyKZNm1i7dq29QxNU79pRnesGSO24Ldj79hNr+vzzz5XQ0FDF0dFRadeunbJr1y57h6SajRs3KkC5x6hRo+wd2j9mKS9AmTdvnr1DU8XYsWOVOnXqKI6OjkpAQIDSs2dP5c8//7R3WOI61bV2VOe6oShSO24HGkVRFFs2MUIIIYSonqrlNRVCCCGEsD1pKoQQQgihCmkqhBBCCKEKaSqEEEIIoQppKoQQQgihCmkqhBBCCKEKaSqEEEIIoYpq31Tk5+czbdq02+pnTNUk+d3Zqnt+d6rqPi+S353tds6v2v/4VUZGBl5eXqSnp+Pp6WnvcFQn+d3Zqnt+d6rqPi+S353tds6v2p+pEEIIIYRtSFMhhBBCCFXY/F8pNRqNXLlyBQ8PDzQajdVfLyMjw+y/1Y3kd2ezdX6KopCZmUlwcDBa7Z3zmULqhrokvzvb7Vw3bH5NxeXLlwkJCbHlSwohyoiJiaF27dr2DqPSpG4IYX+VqRs2P1Ph4eEBwKR1vXByc7D1y9vEv/1P2jsEqxrcuKW9QxC3qIhCtvGH6Ti8U1yL9+L+uni63zlnWKriQH6BvUOwqjdbhts7BHGLqlI3bN5UXDt16eTmgJN79WwqPD2qZ9G7Rq+pnvP2P6HkvKQtvkJQ07V4Pd211fb4cnesnnldI3XjDlaFulG992IhhBBC2Iw0FUIIIYRQhTQVQgghhFCFNBVCCCGEUIU0FUIIIYRQhTQVQgghhFCFNBVCCCGEUIU0FUIIIYRQhTQVQgghhFCFNBVCCCGEUIU0FUIIIYRQhTQVQgghhFCFNBVCCCGEUIU0FUIIIYRQhTQVQgghhFCFNBVCCCGEUIU0FUIIIYRQhTQVQgghhFCFNBVCCCGEUIXe3gFUVTvffnQIGIS73of4vAv8ceVrYnNP33S9Fl6deSD0RU6k7+LnSzNMywfVfo7WPj3Nxp7O3M8PF6arHnuluD6Mxm0caAOgMBol800oPGx5rMsQtF7vmy1SlHyU+BamP2u83kfjMsR8TP4WlNTHVQ+9Mu57pjcPvHgfvkHenD10kTnPzeXknjMVju8yrD2j3hxJUN0AYk/H8e2/f2D36gNmY0ZNH0HfcT1x93bj2PZoPnvmG2LPxFk7FYuqe353NFWPLT0a9+fBqSvoQkDJhIIdKJkfgTHBunlUoIb7YwR5jcdBF0BOwQkupUwlu+DQTdfzdR1Ig4DZpOas5UzieNNyrcaV2t7/xsf1XvRaH/KLYojPnEdi1o/WTKNC1f3Yqi753dKZijlz5lC3bl2cnZ2JjIxk9+7dasdlUXOvTvSuOZZNCYv46sxk4vLO82i9abjpvG64nrdDDe6tOZoL2ccsPn86cx8fnhhleiy99JE1wr85535oPF5FyZqNkjQIik6g8ZkLWt8KV1GMmRgTokwPJbFr+TH5m83HpD1vxSQq1nV4B578eBQ/vLmEp8Nf4dzhi8xY8xreAZ4WxzeLasyrCyexZu5fPN3mZbav3M20FS9Tt3mIacyIl+9n0LN9mfX01zzbfgp52fnMWPM6Dk4OtkrLpLrnpwZ71Q7Vjy2NMzg0R8meg5I8CCVtIujqo/H50vq5WODrOoAQ39e5kjaLY1cHkFNwgsY1FqDX+t1wPUddbUJ8XiMz7+9yz4X4/B9eLl05lzSJI1d6Ep/5HXV838TbpZe10qhQdT+2qlN+VW4qFi1axOTJk5k6dSr79+8nLCyM3r17k5Bg/e68g//97Ev9k4OpG0jMj2FV7BcUGvNp7VvxTq5By9CQyWyK/4nUAssdWpGxkKyiNNMjz5htrRRuSOM6FnIWQe4yMJxByXgDlFxwGXaDtRQwJl33SLYwpMB8jJJhtRxuZOjzA1j97QbWzt/EpROXmfXU1+TnFNB7bA+L4wc/1589aw6y5KNfuRQdy/dvLOLM/nPcP7FP6Zh/9efHd5ax89e9nD9yifdHzcYv2IeOg9raKi2T6p7fP2XP2qH6saVkoaSOhrzVYDgPhQdRMqajcWgJ2prWTqecQM9xJGb+TFL2EvIKT3Mx5VWMSi7+7sNvsJaW+v6ziE3/lPyiS+WedXcKJyl7GZn5uygwXCYx6ydyCk7g5nS31fKoSHU/tqpTflVuKj755BOeeOIJxowZQ7Nmzfjyyy9xdXVl7ty51ojPRKfRU9OlAeeySk/nKSicyzpEiGuTCtfrVmME2UXp7E9dX+GYuu4teOmu73m28X8YEPwULjoPVWOvHIfiTz4FO65bpkDBDjQOrSteTeOKJmATmoAtaLy/AH3D8mMcI9EE7ELjvxaN53TQeKsd/E3pHfQ0Dq/P/vWlp5sVRWH/+sM0a9/Y4jrNohqzf4P56em9fx7irpLxQfVq4FfThwPrj5iez8nIIfrvMzSLqnifsIbqnp8a7FU7rHpsXU/rgaIYi78KsSENDrg5tiQjb9t1SxUy8rbh7tSmwvWCvf5FkTGJpKxFFp/Pyt+Hj0svHHSBAHg4ReHsUI/03C1qhn9T1f3Yqm75VampKCgoYN++ffTqVXpmQKvV0qtXL3bu3Kl6cNdz1Xmi0+jIKkozW55VlIa73sfiOqGud9Hatxe/xs6ucLtnMg+wImYW3597g3Vx31PHrQWP1H0Dja2vYdX6oNHoiz8RXc+QXPwdsCVF51DSp6CkPo2S9iKgReO7GLRBpiFK/haU9JdQUh9DyfwQHNuh8fkWW1+j6+XvgU6vIzU+3Wx5akI6PkHeFtfxCfImrez4+DR8S8Zf+29qfFq5MT6BlrdpLdU9v3/KnrXDWseWOUc0Hi9B3ipQstSM/qb0uuL8Cg3m+RUaknDQWc7P3SmCAPcRXEj+d4XbvZQyldzC09xdezfhoWdoHPg9F1P+j6x8G31lVaK6H1vVLb8qXaiZlJSEwWAgMDDQbHlgYCDR0dEW18nPzyc/P9/054wM25x6d9S6MCTkeX69PIccQ8WfHI6mbzX9f0L+ReJzLzCp6dfUdWvB+ewKLuK6XRQeLH6UUNL2o/Ffg8Z1JErWzOKFeb+Xji86hVJ0Em3AXyiOkVBg5WIuRImq1g571Q2TyhxbJno03p8BGpSMqbaL8RZpNW7U95/JheR/U2RMrXBcoOdo3JxacyphLAVFsXg4R1LH9y0KDfFk5G23YcTiTmL1j6szZszAy8vL9AgJCbn5ShbkGDIwKAbc9d5my9313mQVlT8wfB2D8HEM5KG6r/NGi+W80WI5Yd7daeLZjjdaLMfH0fInjtTCeLKL0vFzsvH3osZUFKUItP7my3V+YEys5EaKoOg46OpUPMQQg2JMufEYK0hPysRQZMAn0PyiWp8aXqTGpVlcJzUuDe+y4wO9SSkZf+2/ZTtvn0Dvch26tVX3/GxNrboBWPnY0qPxngW6YJSU0TY/SwFQZCjOz0Fnnp+Dzp9CQ/n8nPR1cNKH0KjGd0SEniUi9Cx+bkPxdrmHiNCzOOlD0WicqOX9EjGpb5Oeu4HcwmgSMr8nJXsVQZ7jy23Tmqr7sVXd8qtSU+Hv749OpyM+Pt5seXx8PEFBlv+SnjJlCunp6aZHTEzMLQVqUIq4mnuW+m6tTMs0aKjn3oqYnJPlxiflX2bOqWf58vQk0+Nkxm4uZB/hy9OTyChMKrcOgKfeDxedB5mFFXfw1lEIhcfQOEZdt0wDjh1QCg9UuJY5Legb3/iWNm1Q8TUVNr7traiwiFP7ztG6Z0vTMo1GQ+ueLTm+65TFdY7vPEXrHi3NlrXp1YoTJePjzieQfDWV1j1Lb6F19XChaWRDju8sv09YU3XP75+qau1Qq24Us9axda2hqFvSUKT9gxhvnUIh2QVH8HTueN1SDZ7OHcnK319ufF7hWY5euYdjV/uaHmm568jM28mxq30pKLqKBge0GkdQjGVey4Ctvzqt7sdWdcuvSnuHo6Mj4eHhbNiwwbTMaDSyYcMGoqKiLK7j5OSEp6en2eNW7UhaSRvfewnz7o6/U20GBD+Fo9aZAyUXYQ6uPYlegY8CUKQUkpB/yeyRZ8wm35BLQv4lDEoRjlpn7g0aTW2Xxng71KCeWyserPsqKQVXOZNV/mC0NiVnLriOAOfBoGuAxvNN0LgUX7EOaLw+QOP+QukKbhPBsVPxffL6Zmi8PgZdLZScJcXPa1zReLwCDneDrhY4RqHx+QIMFyF/W/kArGzZp6voN64n9zzWldCmtXjuiydwdnNi7byNALw8fyJj333INH7FZ7/Tts/dDJs8gJAmwTw69QEaRzRg5ew1pWNm/c5Drw0lamAEdVuE8vL3E0m+ksr2X/ZIfreRqtYONesGWOHYQo/G+3NwaImS/gJotMVnQrT+gO1vSYzP+JYAj5H4uQ3FWd+QOr7voNW4kpRVHG89v0+o7f0yAAr55BaeMnsYjBkYlCxyC0+hUIhRySIjbye1fV7Fw6k9jvoQ/NyG4e82lNSctTbPr7ofW9Upvyr/+NXkyZMZNWoUERERtGvXjpkzZ5Kdnc2YMWOsEZ+ZY+nbcNN70iPwIdz1PsTlnWfB+elkFxVfsOLl4I+C8SZbKWVUjAQ61yXMpzvOWjcyi1I4m3WQv+J/xKAUWSuNiuX9gaL1RePxr5If6DlR/CNV125l0wUDimm4RusJXm8XjzWmQ+ExlOQRYCj5wRTFAPomaLwHg9aj+FNW/raS74QLbJ0dmxfvwDvAk1HTR+AT5M3Zgxd4te87pCUUz1+NUH8UY2l+x3eeYsbDsxj91oOMeechYk9fZdrgD7hwrPRT66IPVuLs5sykr57E3duVo9uimdL3HQrzCyW/24w9a4fqx5YuEI1z8UWnGv/fzF7KmPIwFNj2YsaUnFXoU/2o5T255MevjnMq4TGKSi5OddQHQxVqI8DZxGep7fMy9f1nodd6k2+4zOW0D0nM+sEKGdxYdT+2qlN+GkVRlJsPMzd79mw+/PBD4uLiuPvuu/nss8+IjIys1LoZGRl4eXnxyo6+OLnfmT/gczNTA47bOwSr6h18t71DELeoSClkEytJT0//x5/+b8Wt1o5rdSP1VH08Parnvy6wL9/2jb4tvVqvnb1DELeoKnXjln6me+LEiUycOPGWghNC/O+S2iFE9VY9W34hhBBC2Jw0FUIIIYRQhTQVQgghhFCFNBVCCCGEUIU0FUIIIYRQhTQVQgghhFCFNBVCCCGEUIU0FUIIIYRQhTQVQgghhFCFNBVCCCGEUIU0FUIIIYRQhTQVQgghhFCFNBVCCCGEUIU0FUIIIYRQhTQVQgghhFCFNBVCCCGEUIU0FUIIIYRQhTQVQgghhFCFNBVCCCGEUIU0FUIIIYRQhTQVQgghhFCFNBVCCCGEUIXeXi88wPMQ7h7Vs6dp8t3z9g7BqnT/p7F3CFYV8tYOe4cgKnD/yT7o3ZzsHYZVXEzwtXcIVqVbYrR3CFYV+sARe4dwW6ief6sLIYQQwuakqRBCCCGEKqSpEEIIIYQqpKkQQgghhCqkqRBCCCGEKqSpEEIIIYQqpKkQQgghhCqkqRBCCCGEKqSpEEIIIYQqpKkQQgghhCqkqRBCCCGEKqSpEEIIIYQqpKkQQgghhCqkqRBCCCGEKqSpEEIIIYQqpKkQQgghhCqkqRBCCCGEKqSpEEIIIYQqpKkQQgghhCqkqRBCCCGEKqSpEEIIIYQq9PYOoKr83UdRw/NJ9LoAcgtOEJv6BjkFBy2O9XV7gFC/T8yWGZU8Dsc0Mv3Zy6UPfu6P4urYEr3Oh5NXe5NbeNyaKdzQw+FhjGsfQYC7G9Hxibz550YOX4mzOHb43S0Z1PIuGgf4A3A0Lp5PNm03G//+gN4MCWtutt6Wsxd4/Ofl1kviBh5qF8bjHcLxL8nv7T82ciQ23uLYB8JbcH9YMxrV8APg2JUEPt2wrcLx0wb0ZGTbVry7ehP/3XXAajncyH3P9OaBF+/DN8ibs4cuMue5uZzcc6bC8V2GtWfUmyMJqhtA7Ok4vv33D+xebR77qOkj6DuuJ+7ebhzbHs1nz3xD7BnL+4So2P21OjI8pDu+jh6czb7C56dWcDLzksWxnfxb8lCdXtRy8Uen1RKbk8SSmE2sj99nNi7UtQZPNBhAK+8G6DRaLmbHM/3ofBLy06yfUBmPNAxnXNMoApzdOZEWz5v713I45YrFsffWasLTzTpSx90XvVbLhcwU5p78m18uHgFAr9HyfMtudKvZkBB3bzIL89kRf54PD/1FQl6WLdMyeah+BI837kCAszvR6fG8dXA1R1It53dPcFOeatqJULfi/C5mpTDv9E5WXirNb1Lz7nQJakiImw9ZhfnsSDjHx0c32C2/6lI7qnymYsuWLQwcOJDg4GA0Gg2//PKLFcKyzNt1IME+/0dc+kxOXu1HbuFx6tdYgF7rV+E6BmMGRy+3MT2Ox0aZPa/VuJKdv5srae9aO/yb6ndXY17t1ZXZW3cx6LsfOJGQyNyRQ/B1dbE4PrJObVYdP8mjPy5h+Pc/EZeRybwHhxDo4W42bvPZ80TN/NL0eP6X322RTjl9mzfm3727MGfTLoZ89SMn45L49tEh+LpZzq9d3dr8fiSaUfOXMvLbn4nLyOS7R4dQw8Ot3NheTRsQVjuI+Az7FASArsM78OTHo/jhzSU8Hf4K5w5fZMaa1/AO8LQ4vllUY15dOIk1c//i6TYvs33lbqateJm6zUNMY0a8fD+Dnu3LrKe/5tn2U8jLzmfGmtdxcHKwVVqqsGfdAOhW426eang//72wlqf2fsLZrCu8HzYebwd3i+Mzi3L48eJ6nt0/iyd2f8TauN283HQkEb5NTGNqOvsxq82zxOQk8MKB//DE7o/44cI6CoxFtkrLpF9IM169+x4+P7aV+//8lui0eOZ1fRBfJ1eL49ML8vjP8e08sH4eA9Z8w7Lzh3iv3UA6B9UHwFnvQHOfIOYcL97ehO1Lqefhx1edh9syLZO+tZsxpdW9zDmxmcEbviY6PY7vOj18g/xy+SJ6KyM2zeW+9V+x/OJB3g2/n06BDQBw1jnQzLsmX5zYypAN3zBx12LqefjzRYeRtkzLpDrVjio3FdnZ2YSFhTFnzhxrxHNDAR5PkJz1EynZi8kvOs3llCkYjXn4uo+4wVoKRcbE6x5JZs+m5iwnPmMWWXnbrBt8JYyNDGfRwaMsO3yMM0kpvPHHenKLihgW1sLi+BdWrmbhvkOciE/kXHIqr/6+Dq1GQ1TdELNxBUUGkrJzTI+MvHxbpFPO6A5tWLLvKMsPHudsYgpTV60nr7CIoa0t5/fSsjX8tOcw0XGJnE9K5fWVJfnVDzUbV8PDjdf7deelZWsoMhhskYpFQ58fwOpvN7B2/iYunbjMrKe+Jj+ngN5je1gcP/i5/uxZc5AlH/3KpehYvn9jEWf2n+P+iX1Kx/yrPz++s4ydv+7l/JFLvD9qNn7BPnQc1NZWaanCnnUDYFhIV/64sou1cXu4mBPPzJNLyTcW0qdmO4vjD6WdZXvSES7lJHA1L5nll7dyLvsqLbzqmcY8Xr8ffyef4OuzqziTFcvVvGR2Jh8jrdD2je3YJpEsOneAZecPcSYjif/b+we5RYU8UO9ui+P/TrzIutiTnM1M5lJ2Kt+f3sPJ9HjC/YtrR1ZhPqM3L+SPmBOcz0zhYHIs0/evoaVvMDVdLf9FZ01jGkWx+MJ+ll88xNnMJKbu/508QyFD67S2OH530kXWXznJucwkYrJT+e+Z3cX5+ZXkV5TP2G0/sDr2OOezkjmUEstbB1fTwieYmi62z6861Y4qNxV9+/bl7bffZvDgwdaIp0IaHHB1bFnmL3+FrLytuDmGV7ieVuNGs+CdNAv+m3r+3+Hs0Nj6wd4CB62W5jUD2XH+ommZAuw4f5HWtWtWahsuDnr0Wh3puXlmyyPr1GbXpKdY+9RopvfpibeLs5qhV4qDriS/c6WnmxUFdp67xN0hVchPZ56fRgMfDOnDdzv2cSYxWfW4K0vvoKdxeH32rz9sWqYoCvvXH6ZZe8v7XLOoxuzfcNhs2d4/D3FXyfigejXwq+nDgfVHTM/nZOQQ/fcZmkU14U5ir7oBoNfoaOxem/2pp0zLFBT2p5yimWfdSm2jtU8jarsGcCTtHAAaNET63cXlnETeCxvP0o7TmR3+Lzr6W26QrclBq6WFT022x583LVOAHfEXaO1fq1LbiKpRl3oefuxJtPx1EICHgzNGRSGzIK/CMdbgoNHS3LsmOxLK5JdwntZ+tSu1jfYB9YrzS6o4P3cHJ4yKQkahbfOrbrXjjrmmQqfzRaPRU2hINFteaEzCyaGhxXXyCs9yKeVF8gpOoNV6UsNzPI0CVxB9tSeFhtvrO2kfVxf0Wi1J2Tlmy5Ozc2jg51upbbzUozMJWVlsP1964Gw5d4G1J09zOS2DUB8vXujWiW9HDmH4/J8wKoqqOdyIj6sLep2W5Czz/JKycqjn71OpbbxwT2cSMrPMGpMnOrXFYFRYYKdrKK7x8vdAp9eRGp9utjw1IZ2QppYLu0+QN2llx8en4RvkDWD6b2p8WrkxPoHeaoT9P8HLwQ2dVkdqQabZ8tTCTELcalS4npvOmUUdpuKg1WNUjMw6tYx9JY2Jt6M7rnpnRtbpwbxzq/nm7Cra+jZlWovRvHDwCw6nnbVqTtfzcXRFr9WSnJdttjwpL4v6nhV/Nezu4MT2gf/CUafDqChM3bfarDG5nqNWx8utevDbpWNkFRWoGv/N+DhZzi85L5v6Hv4Vrueud2JL/+dx1BbnN/3AH+xIOGdxrKNWx4stevJ7zFGybZxfdasdVm8q8vPzyc8vPd2ekZFh7Zc0ySnYT07BftOfzyfu5a6aG/Fzf4S49I9sFoctjI9qS/9mTXnkh8UUXPcVwO/HT5r+/1RiEicTkvhrwuNE1qnNzgsx9gj1ljzRqS39WjThsflLKCgqzq95zRo8GtmaoV/9aOfohNrsWTeuyTHkM37vx7joHGnj04inG97P1bxkDqWdRYsGgB1Jx1h2eQsAZ7Ou0NyrLgODo2zaVNyq7MJ87vvzG1z1jnQIrMurd99DTFYafydeNBun12j5vMNQNBqYuvcPO0VbddlF+Qxa/xWuekeiatTj363uJSY7ld1J5fObFTkMDRqmHrDP9WbVidWbihkzZjB9+vR/vB2DIQVFKcJBF2C23EHrT1GZsxcVKyK38ChO+rr/OB61pebkUmQ04u9mfuGRn5sridnZFaxV7PHIcJ7s0JZRC5dxMiHphmNj0tJJyc6hjo+3TZuK1JxcigxG/NzN8/N3dyWpzNmLssZ2COeJThGM/e9yTsWX5hdepxZ+bq789fw40zK9Tssrvbswqn1res6cq24SN5CelImhyIBPoJfZcp8aXqTGpVlcJzUuDe+y4wO9SSkZf+2/1y+79uezhy6oFPntSa26AZBemI3BaMDH0cNsuY+DByn5mRWsVfwVyZXc4v3tbNYVQl0DebBOTw6lnSW9MJsio4GL2eZnPC9lJ9DCu56lzVlNakEORUYjfs7mFzD7O7uTdIM7GRTgYlYqACfS4mng6c9Td3Uwayr0Gi2fdRhCsJsXj278weZnKQBS8y3n5+fsdtP8LmUX5xedHk8DD3/GN+3E7m3m+c2MHEawqxejti6w+VkKqH61w+q/UzFlyhTS09NNj5iYW/uLTKGQnIIjuDt3vG6pBnfnTmQX7KtwPXNanB2aUmhIuKUYrKnQaOTY1Xii6pZehKgBOtQN5cDlqxWu90T7CCZ0as/jP63g6FXLt1peL8jDHW9XFxKybtyoqK3QUJJf/dKLSDUaaF8vhIMxFef3eMcInu4ayRM/rODoFfP8fj10gvu/WMDgL38wPeIzsvhu+z7GLVhhtVwsKSos4tS+c7Tu2dK0TKPR0LpnS47vOmVxneM7T9G6R0uzZW16teJEyfi48wkkX02ldc/S7+ldPVxoGtmQ4ztPUp2pVTcAihQDp7Iu09qn9FZyDRpa+zTieMaFSm9Ho9HgoNGbtnky8xIhruZfn9R2DSA+L/WWY70VhUYjR1Ov0iGwtJnRAB0C63IgKbbS29GgwVFX+jnzWkNR18OXUZt+JK0gV82wK61QMXIs7SpRAeb5RQXU40Dy5UpvR6vR4KjVmf58raGo4+7L6K0/2C2/6lY7rH6mwsnJCScnJ1W2lZj5DaF+n5BTcJic/IMEeDyOVutCStZiAEL9PqWwKI6r6e8DEOj5L3IKDpBfeAGd1pMank/hqKtNctZPpm3qtN446oLR6wKL43UovuWo0FB8t4gtzf17Hx/c14ejV+M5fCWO0e3a4OLgwLLDxwD4YGAf4jOz+HhT8cWq46Pa8q8uUUz+ZTWX09NNZzlyCgrJKSzE1cGBZztHsTb6NInZ2YT6ePFyjy5cTElj27mLFcZhLfN37Oe9wb05GpvA4dg4RkW1xsXRgeUHivN7b3BvEjKz+GT9dgDGdYrgue5RvLh0NbFpGfi7X5dfQSFpuXmklbkotchgICkrm/PJti3sAMs+XcXL8ydwau9ZTu4+w+BJ/XF2c2LtvI0AvDx/IklXUpj76kIAVnz2Ox9vms6wyQP4+/f9dBvZkcYRDZj55Femba6Y9TsPvTaU2NNxXD2fwOg3R5B8JZXtv+yxeX62pGbdAFgas5lXmj7IqcwYojMuMbR2V5x1jqy9uhuAV+56kKT8DL47V3z6+8HQnpzKjOFKbhIOWj2RfndxT2AEs04tNW1z0aVN/F/zRzmcdo6DaWdo69uUKL9mTD74H9Xirqy5J//mw8j7OJJylcPJsYxuEomL3oGl5w8B8GHkfcTnZPLRkeJ98am7OnAk5SqXslJx1OroFtyQQXVbMnXfaqD4L9zZHYfS3KcmT2z9Ga1Gg3/JmYL0glwKjUab5jfv9E7ejxjE0dQrHE69wqiGxfktv3gQgPcj7ic+N5NPjv0FwPgmHTmaepVL2Sk4avV0DWrIfaGtmHbgD1N+n7V/gGbeQTy542d0Gg3+Ttflp9g2v+pUO6rcVGRlZXHmTOkPcpw/f56DBw/i6+tLaGjoDdb859JyfkOv9aWm1wslP351nHMJj5puE3XU1Sq+paCETutNiO/76HUBGIzp5BQc4XT8IPKLTpvGeLncY/YDWXX9iwtCXPonxKV/atV8yvrjxCl83Vz5V9cOBLi5ciI+kcd/Xk5yycWbwV4eKNfl92CbVjjq9cweNtBsO59t2cnnW3diUBSa1PBncKtmeDg7kZCZxbbzF5m5eYfZdRe2svrYKXzdXHi2RxQB7q6ciEvkiQUrKs4voji/z0aa5zd7405mb9pl09grY/PiHXgHeDJq+gh8grw5e/ACr/Z9h7SE4guqaoT6oxhL8zu+8xQzHp7F6LceZMw7DxF7+irTBn/AhWOln8oXfbASZzdnJn31JO7erhzdFs2Uvu9QmF9o8/z+CXvWDYBNCQfxcnBndL0++Dh6cjYrln8f/prUkts/azj5mO17zjpHnms8lAAnb/KNhcTkxDPjxI9sSjhoGrM96QgzTy7lwTo9mdhoMDE5CUw7Np+j6ZYvdrSmP2KO4+fkyqQWXQlwduN4WjxjN/9Ecn7xGclgVy+zC7NddI5MD+9LkIsHeYYizmUm8cKulfwRU/zDf4EuHvSqVXyXwKre481e6+G/FpS77sLaVl8+jq+TG88161b8417p8YzbttCUX80y+bnqHJnaui9BLp6m/F7as4LVl0vz6xlcnN+vvZ40e61HN39f7roLa6tOtUOjKFW7BWDTpk1079693PJRo0Yxf/78m66fkZGBl5cXW48G4+5RPX8l/IEFz9s7BKvSFWjsHYJVhby1w94hWE2RUsgmVpKeno6np+3ux1erbnT57Rn0buqdwbidXEyo3F1edyqd3raf/m0t9IEjNx90h6pK3ajymYpu3bpRxT5ECPE/TuqGEP8bquepAiGEEELYnDQVQgghhFCFNBVCCCGEUIU0FUIIIYRQhTQVQgghhFCFNBVCCCGEUIU0FUIIIYRQhTQVQgghhFCFNBVCCCGEUIU0FUIIIYRQhTQVQgghhFCFNBVCCCGEUIU0FUIIIYRQhTQVQgghhFCFNBVCCCGEUIU0FUIIIYRQhTQVQgghhFCFNBVCCCGEUIU0FUIIIYRQhTQVQgghhFCFNBVCCCGEUIU0FUIIIYRQhd5eL/zwqmfQOjvb6+WtyjlXY+8QrEuxdwDWde69KHuHYDXGvDyYutLeYdyy2O210VXXupFl7wisS6nmH2F1G4PtHYLVKNn50L9yY6v5NAshhBDCVqSpEEIIIYQqpKkQQgghhCqkqRBCCCGEKqSpEEIIIYQqpKkQQgghhCqkqRBCCCGEKqSpEEIIIYQqpKkQQgghhCqkqRBCCCGEKqSpEEIIIYQqpKkQQgghhCqkqRBCCCGEKqSpEEIIIYQqpKkQQgghhCqkqRBCCCGEKqSpEEIIIYQqpKkQQgghhCqkqRBCCCGEKqSpEEIIIYQqpKkQQgghhCr09g6gqh5tdTfjwyMIcHXjRFIi0zb9xaH4OItjRzZvyZC7mtHYzx+AIwnxfLRjm9l4VwcHXunYmXvqN8THxZmY9AzmH9rPwiOHbZJPWQ9FhjG2Uzj+7m5ExyXyzqqNHImNtzj2gYgW3Hd3MxoF+gFw/EoCn/65zWz8hB7t6deyCUFeHhQaDBy/ksDMdds5fNnye2ZtD0WGMbZzmfwu3yC/1tflF5vAp+u2mY2f0KM9/Vpdl1+sffN7pHUYT7SLIMDNjRMJiUxfv5HDcZZjGdGqJYOb30XjgOL982hcPB9t2V5ufANfX17u1pnIkNroNFrOJCfzzC+/cTUz0+r5VCcPtQ3j8Q7hBJTse2+t3siRKxXse21aMKhVMxrVKN73jl1N4JMN28zGT+zanv4tmhDkWbzvHbuawKd/bedwrH32vZEdwhjTNRx/DzdOXk3k3V82cjTGcn5D27XgvvBmNAwqPbZmrd5WbvyEe6MYFtkSDxcnDly4wlvLN3ApKc3aqVj0YFQYY7pcl9/KimvHsHYtuK9NMxpeVztmrdlWbvzEe6IY1q40vzdXbOBScpq1U7FoYHAnhoX0wMfRk3NZsfznzDJOZV6yOLajfytGhN5DsIs/eo2O2NxElsdsZEPCXtOYNV1nWVz327MrWXr5L6vkAFU8UzFjxgzatm2Lh4cHNWrUYNCgQZw8edJasZXTv1ETXuvclVl/72TATws4kZjI94OG4ufiYnF8ZO0Qfj0VzYPLFjNk8U9czcrkv4OHEujmbhrzeududKlTl+fX/kGv/85n3sF9TO/Wk171GtgqLZO+LRrzSt8uzNm4i6H/+ZGTcUl8M3oIvm6W82tbrzZ/HI5m9HdLefCrn7mansm3o4dQw8PNNOZCUipvr9rI/Z8v4JFvFhObms63o4fg42p5m9bUt2VjXunXhTl/7WLonCrm9+V1+XmWye+3jdz/2QIe+XoxsWnpfDvGPvn1b9qYV7t35bPtu7jv+x+ITkxk/vAh+FUQS2RobX47cZKHf17CsB9+4mpmJt8PH0Kge+n+GertxaKHR3AuOYWHflpM//n/ZfbOXRQYimyVlirsXTv6Nm/MlHu7MGfzLgZ/9SPR8Ul898gQfCuamzq1+f1oNI99v5SR3xXve3MfLXNsJafy5h8bGfjFAh6aV7zvzX3EPvten7DGvDywC1+s28UDM3/k5JUkvhp3g2OrQW3+OBjN2K+W8sjsn4lLy+TrJ8yPrbHdIni40928uXw9D33+E7kFhXw1bgiOep2t0jLp06oxLw/own827OKBz37k5NUkvnr8BvnVL8nv66U8/J+fiUvP5Otx5vk93jWChzvezfQV63lwdnF+Xz9un/y6BLTmiQaD+eHCWibu+5BzWVd4p+XTeDm4WxyfWZjDzxfX8fyBmTy9933+jNvN5KYPEe7T1DTmwR2vmz0+jl6IUTGyLemQVXOpUlOxefNmJkyYwK5du1i3bh2FhYXce++9ZGdnWys+M+PahLPo2BGWHj/GmZQUXvtrHblFhTzQvKXF8c+v/YMfDh/iRFIi51JT+Pf6P9GgoWNIqGlMm5rBLD9xnL9jLxObmcFPR49wIjGRsKAgm+R0vVEd27Bk71FW7D/O2cQUpv26nrzCIoaEt7A4/uUla/hp92Gi4xI5n5TK/61Yh1ajIapBaX6/Hz7JzrOXuJyazpmEZN5bvQUPZyeaBPnbKi2TcvmtrER+fx8m+mqZ/OrfIL8/7Jff2IhwFh0+yrKjxziTnMLra9eTW1jEsJaW85u8ajU/HjzEiYREzqWkMmXNOjQaDR3qhJjGvNC5I5vOnef9zVs5npDIpbR0Npw5R3JOrq3SUoW9a8eY9m1YvP8oyw8e52xSClNXFe97Q1tbnpsXV6xh4d7DRMcnci45ldd/K9n36pXue6uOnmTn+UtcTkvnTGIyM9aW7HuBtt/3HuvShqV/H+WXvcc5l5DCm8uL8xvcznJ+//5pDYt2HubklUTOJ6YydUlxfu0bleb3aOc2fL1hNxuPnePU1SRe/XkNNTzd6Nnc9h+4RnVuw9LdxfmdTUhh+oqS2tHWcn6v/LyGn3eV1I7EVN5YWpJfw+vy69SGr/7azcbj5zgVl8SUxfbLb0jtbqy5uoN18X9zKSeez08vJt9YQO+g9hbHH04/w47kw8TkxHM1L5mVsZs5n3WF5l71TWNSCzPNHlH+LTiUdoa4vGSr5lKlpmLNmjWMHj2a5s2bExYWxvz587l06RL79u2zVnwmDlotLWoEsu1S6ekgBdh+6RJtgmpWahsuej0OOi1p+XmmZfuvXqFn/Qamsxfta4dQz8eHrRcvqBn+TTnotDQPDmTn2evyU2Dn2UvcHVK5/Jwd9Oh1OtJz8yw+76DTMjyiJRm5eUTHJaoSd2WZ8jtTJr8zl7g7VMX82topP62WFkGB7Lhw0bRMAXZcvEjr4Erunw56HLQ60vKK89MA3RrU50JKKvMeGMLuCU+x7JEHuaeh7YveP2Xv2tE8OJAd58xrx45zl2hdu/Jzo9feYN/TahkR3pKMvDxO2njf0+u0NKsVyK7T5sfWrtOXCKtTyWPLseTYyinOr7avFwGebuy8bptZeQUcvhRHWJ1gdRO4CYeS/HaWze/MJcKqWjvK5LerbH4xcYSF2jY/vUZHI48QDqSeMi1TUDiQeoq7POtWaht3ezemtmsNjqSftfi8t4MH7XybszZulxoh39A/uqYiPT0dAF9fX1WCuREfFxf0Wi1JOeafbJJycmhQydd/pVMX4rOy2XaptPBP2/wX7/a4h13jnqTQYMCoKLy6YR27r8SqGv/NeLu6oNdpSc7KMVuenJVDPX+fSm3jxd6dScjMYsdZ8+/hujWpx0fD++Hi4EBiVjaPz19OWo7l4mgtN8wvoJL59elMQkYF+Y24Lr95ts/Px/Xa/mmeX1J2DvUruX++3LUz8VlZbL9QnJ+fmyvujo48GdmOT7Zt54PNW+lSry7/GXwfD/+8hN0xl1XPw1ZsWjtK5iY5u8y+l51D/coeW71Kjq1zZfa9RvX4ZFjJvpeZzdgFy0mtoPGwFh+3GxxbNSqX3+R+nUnMyDL9xe3v4Vq8jczy27z2nK1UWDsyK187XuhXXDuufai5lkOShffM1vl5Orih0+hIKzS/RiqtMJMQ1xoVrueqc+bHqDdx0OgxYmT26SUcSLX8lWKvoLbkGvLYnmjdrz7gHzQVRqORSZMm0bFjR1q0sHwKCiA/P5/8/HzTnzMyMm71Jf+RpyLaMbBxEx5ctpgCg8G0fFRYa1rXrMm4X1cQm5lBu+DaTO/ek/jsLLbHWL5I5nY0rktb+rZswqjvllBQZDB77u9zMQyZ8wM+ri480LYln47sz4gvfyIl+845hW7K79sK8pv9Az5uLjwQcWfm92RkWwY0bcpDP5fun1qNBoD1Z84yb+9+AE4kJNKmVjAP3d3qjm0qKlM7bpe6AfBEx7b0a9GEx+YvMasdAH9fiGHQl8XH1vDwlswc1p8Hvv2JlDvo66nHu7el791NGPNl+WOrOhjXrS19w5ow+qvqlV+uIZ9n9n6Ai86Ju30aM77BIOJykzmcfqbc2N5B7fkrYR+FivWvxbrlW0onTJjA0aNH+fnnn284bsaMGXh5eZkeISEhNxxfkdTcXIqMRvxd3cyW+7u6kniT72WfaBPB0xFteWzFMqKTkkzLnXR6XuzQibe3bGLD+XNEJyXx38MH+f3USZ5oE3FLcd6qtJxcigxG/NzNu2Q/d9dy3XRZYzqG80TnCMbNX86p+KRyz+cWFnEpJZ1Dl+N4fcU6DAYjQyu4jsFa/lF+ncJ5oksl8ospyc9o+/xSc67tn+b5+bvdfP8c1zacpyLbMnrJMk4mluaXmpNLocHAmWTz70DPJqcQ7OGhXvA2VpnaoVbdgNK58XMrs++53XzfGxsVzvhOETy+YDknEyrY91LTORQbx2u/rqPIaGRYGxvve9k3OLYyb5zf6K7hPN49gvHfLOfU1dL8rq3n51H1baqtwtrhUYn8uoTzeLcInvh2OafiyufnfwvvmdoyCrMxKAa8HcyPaW8HD1ILKr7DS0Hhal4S57JjWX55I9sSDzEitFe5cc296hPiGsiaqztVj92SW2oqJk6cyKpVq9i4cSO1a9e+4dgpU6aQnp5uesTExNxSoIVGI0cT4s0ustQAHUJC2R93tcL1ngxvy8R27Rn1y3KOJJjfTuSg0+Ko02FUFLPlBsVo+pRoK4UGI8euxNO+fmnx1Gigff0QDsZUnN/jnSJ4unsk479fwbEKbo8rS6PV2PwKZ1N+Dcrk1yCEg5dukF/n6/Kr4NbasjQaO+RnNHI0Lp4Odcz3z6g6oRy4UnF+49tFMLFDe8YsWcGROPP8Co1GjsTFU8/X/BRvPR8fYjPuzNtJK1s71KobUPw+HrsST9T1xxYQVT+EA5crnptxHSJ4pksk435YwdGrldv3tBoNjjrb7ntFBiPHY+OJbGh+bEU2DOHQxYrzG9Mtgid7RvLUtys4VuZWy8sp6SRmZNP+um26OTnSKjSIQxevqJ/EDRSW5NfeUn43qB1ju0bwVM9InpxbvnZcyy+ybH4hQRy6ZNv8ihQDpzNjuNunsWmZBg13+zTmRMaFSm9HgwYHbfkvH/oEtedU5iXOZ9smryp9/aEoCs8++ywrVqxg06ZN1KtX76brODk54eTkdMsBXu/b/fv4+N4+HE6I41BcHGNbt8HVwYGlx48C8PG9fYjLyuLDHduA4obi+fYdmLT2Dy5npJs+ReYUFpJTWEhWQQG7LscwpVNX8oqKiM3MILJWCEPuasbbWzarEnNVfL99PzOG9ubolQSOXI7jsQ6tcXF0YMW+YwC8N7Q38RlZfLpuOwDjOkfwbM8oXly8mti0DFPXnVNQSE5BIS4Oep7sFsnGE2dJzMrG29WFhyLDCPRwZ+3R0/bLL7aC/IaV5Pfndfn1Kskv9Qb5RZ8lMbMkv/ZhBHraJ7+5e/fxYb8+HImL59DVOMZElOyfR4rz+6hf8f750Zbi/XN8u7ZM6hTF86tWF++fbtflV1gIwDe79zLrvv7siYll16UYutSrS4+G9Xnop8U2z++fqGrtULNuAMzbtZ/3BxUfW4dj4xjVvjUuDg4sP1g8N+8P6k18ZhafbCje957oGMFz3aJ4YXnJsVVmblwc9DzVOZK/ThYfWz6uLjzctnjfW3Pc9vvef7fs550RvTl2OYGjMXE80rn42PplT3F+747sTUJ6FjNXF+c3tlsEE3tH8fLC4mPr2hmJnPxCcguK970FW/czvmckF5PSiE1JZ2LvDiRkZLPhmOWLAa3p+637eXd4cX5HLsfxaKfi+VuxtyS/4b1JyMhi5pri/B7vGsHEe6N4+afVXEkpXzsAFmzbz5M9IrmUlMbl1HSevdd++S2/vIkXmz7M6cxLnMy8xOBaXXHWOvJn3N8AvNjkYZIL0pl3fhUAI0J6cSorhqu5STho9bT1bUbPwLbMPm1eF1x1TnQOuJuvz660WS5VaiomTJjAwoULWblyJR4eHsSV/EiPl5cXLhX8VoSafj99Ej8XFya374i/qysnkhIZ/csy08VxwR6eZmcdHmkVhpNezxf97zPbzsxdO5j1d/GpoGdXr+Lljp2Z2acf3s7OxGZk8tGO7fx4xPoXtJS1+ugpfNxceK5nFP7urpy4msj471eYLjCr6e1hlt/Idq1w1Ov57KGBZtuZ/ddO5vy1C4OiUN/fh0EPDcTH1Zm0nDyOxMbzyLeLOZNg3duKLFl95Lr8PErym39dfl5l8ousIL8N1+UX4MOgNmXy+8Y++f0efQpfF1cmdeqAv5srJxISGbNkOckl+2dNT/P8Hm7dCie9nv8MMs9v1vadfLa9eP/88/QZ/u/P9Tzdvh1v9OzOuZQUJvzyG/tibftp6p+yd+1YfewUvq4uPNctigB3V07EJTLuxxvsexHF+97nw83n5vNNO5m9eRcGY/GxNTisZN/LLd73Hp63mDOJtt/31hwqPrYm9i4+tqKvJPLUtytMFzeWrR0joorzm/mYeX7/+XMn/1lXfIfA3E17cXF0YNqwXng4O7H/whWe+na5Xa5LWHP4FL5uLky8tzS/J+ea56dcn1/7kvweNc9vzrqd/Gd9cX7fbS7Jb2hpfk/OtU9+WxIP4OXgzqN1+5X8+NVlXj/ypenizRrOPiiU5uesc2Riwwfwd/KiwFhITE4CH0QvYEviAbPtdq3RBtCwKcH6d1ldo1GUMuf+bzS4gq8E5s2bx+jRoyu1jYyMDLy8vAh97220zs6Vfek7inNiNf/180rvMXemAq/qm6AxL48LU18jPT0dT09Pm73uP60d1+pGg3+/i66a1g2HLHtHYF1KNS+LIf0u2DsEqynKzmdD/68qVTeq/PWHEEJUldQOIf43VPPeUQghhBC2Ik2FEEIIIVQhTYUQQgghVCFNhRBCCCFUIU2FEEIIIVQhTYUQQgghVCFNhRBCCCFUIU2FEEIIIVQhTYUQQgghVCFNhRBCCCFUIU2FEEIIIVQhTYUQQgghVCFNhRBCCCFUIU2FEEIIIVQhTYUQQgghVCFNhRBCCCFUIU2FEEIIIVQhTYUQQgghVCFNhRBCCCFUIU2FEEIIIVQhTYUQQgghVKG39QsqigKAMS/P1i9tM4b8at6rKfYOwLqMedU3wWvH3bXj8E5hqhv51bduaPPtHYF1KdW8LBZlV98JLMopACpXNzSKjavL5cuXCQkJseVLCiHKiImJoXbt2vYOo9Kkbghhf5WpGzZvKoxGI1euXMHDwwONRmP118vIyCAkJISYmBg8PT2t/nq2Jvnd2Wydn6IoZGZmEhwcjFZ753x0lLqhLsnvznY71w2bf/2h1Wrt8gnJ09OzWu5c10h+dzZb5ufl5WWT11GT1A3rkPzubLdj3bhzPqoIIYQQ4rYmTYUQQgghVFHtmwonJyemTp2Kk5OTvUOxCsnvzlbd87tTVfd5kfzubLdzfja/UFMIIYQQ1VO1P1MhhBBCCNuQpkIIIYQQqpCmQgghhBCqkKZCCCGEEKqo1k3FnDlzqFu3Ls7OzkRGRrJ79257h6SaLVu2MHDgQIKDg9FoNPzyyy/2Dkk1M2bMoG3btnh4eFCjRg0GDRrEyZMn7R2War744gtatWpl+uGaqKgoVq9ebe+wxHWqa+2oznUDpHbcDqptU7Fo0SImT57M1KlT2b9/P2FhYfTu3ZuEhAR7h6aK7OxswsLCmDNnjr1DUd3mzZuZMGECu3btYt26dRQWFnLvvfeSnZ1t79BUUbt2bd577z327dvH3r176dGjB/fffz/Hjh2zd2iC6l07qnPdAKkdtwWlmmrXrp0yYcIE058NBoMSHByszJgxw45RWQegrFixwt5hWE1CQoICKJs3b7Z3KFbj4+OjfPvtt/YOQyj/O7WjutcNRZHaYQ/V8kxFQUEB+/bto1evXqZlWq2WXr16sXPnTjtGJm5Feno6AL6+vnaORH0Gg4Gff/6Z7OxsoqKi7B3O/zypHdWL1A7bs/k/KGYLSUlJGAwGAgMDzZYHBgYSHR1tp6jErTAajUyaNImOHTvSokULe4ejmiNHjhAVFUVeXh7u7u6sWLGCZs2a2Tus/3lSO6oPqR32US2bClF9TJgwgaNHj7Jt2zZ7h6KqJk2acPDgQdLT01m6dCmjRo1i8+bNt1VxEOJOJrXDPqplU+Hv749OpyM+Pt5seXx8PEFBQXaKSlTVxIkTWbVqFVu2bLHLP3ttTY6OjjRs2BCA8PBw9uzZw6xZs/jqq6/sHNn/Nqkd1YPUDvupltdUODo6Eh4ezoYNG0zLjEYjGzZsuK2+exKWKYrCxIkTWbFiBX/99Rf16tWzd0hWZzQayc/Pt3cY//OkdtzZpHbYX7U8UwEwefJkRo0aRUREBO3atWPmzJlkZ2czZswYe4emiqysLM6cOWP68/nz5zl48CC+vr6EhobaMbJ/bsKECSxcuJCVK1fi4eFBXFwcAF5eXri4uNg5un9uypQp9O3bl9DQUDIzM1m4cCGbNm1i7dq19g5NUL1rR3WuGyC147Zg79tPrOnzzz9XQkNDFUdHR6Vdu3bKrl277B2SajZu3KgA5R6jRo2yd2j/mKW8AGXevHn2Dk0VY8eOVerUqaM4OjoqAQEBSs+ePZU///zT3mGJ61TX2lGd64aiSO24Hcg/fS6EEEIIVVTLayqEEEIIYXvSVAghhBBCFdJUCCGEEEIV0lQIIYQQQhXSVAghhBBCFdJUCCGEEEIV1b6pyM/PZ9q0abfVL46pSfK7s1X3/O5U1X1eJL872+2cX7X/nYqMjAy8vLxIT0/H09PT3uGoTvK7s1X3/O5U1X1eJL872+2cX7U/UyGEEEII25CmQgghhBCqsPk/KGY0Grly5QoeHh5oNBqrv15GRobZf6sbye/OZuv8FEUhMzOT4OBgtNo75zOF1A11SX53ttu5btj8morLly8TEhJiy5cUQpQRExND7dq17R1GpUndEML+KlM3bH6mwsPDA4A2PzyFztXJ1i9vE3+2+M3eIVjV4MYt7R2CuEVFFLKNP0zH4Z3iWrwX99fF0/3OOcNSFauy3ewdglV917q+vUMQt6gqdcPmTcW1U5c6Vyf0btWzqfD0qJ5F7xq9xsHeIYhbVXJe0hZfIajpWrye7tpqe3y5anX2DsGqpG7cwapQN6rn0SmEEEIIm5OmQgghhBCqkKZCCCGEEKqQpkIIIYQQqpCmQgghhBCqkKZCCCGEEKqQpkIIIYQQqpCmQgghhBCqkKZCCCGEEKqQpkIIIYQQqpCmQgghhBCqkKZCCCGEEKqQpkIIIYQQqpCmQgghhBCqkKZCCCGEEKqQpkIIIYQQqpCmQgghhBCqkKZCCCGEEKqQpkIIIYQQqpCmQgghhBCq0Ns7gKoaEhLFw3W74OvowZmsq3xyYiUnMi7fdL1eQWG82eohtiQc498H/2v23LgG93Bf7XZ46F04nHaBD0+s4HJOsrVSuDHXh9G4jQNtABRGo2S+CYWHKx6v8UDjPhmc7wWtNxhiUTLegYLNt75NK7rvmd488OJ9+AZ5c/bQReY8N5eTe85UOL7LsPaMenMkQXUDiD0dx7f//oHdqw+YjRk1fQR9x/XE3duNY9uj+eyZb4g9E2ftVCyq7vnd0apyHLgMQev1vtkiRclHiW9h+rPG/Vlw7g/amkAhFB5FyfoUCg9ZMYmK1fccTiPvUTjr/EgvOMWhpPdJzT920/Vqu/emXeB7XMneyK64yablQxocsDj+SPKnnE77r8XnrKm6H1vVJb9bOlMxZ84c6tati7OzM5GRkezevVvtuCzqGdiK55oMYO7ZDYzZ9RlnMq/yafjj+Di63XC9IGcfJjbuz8HUc+Wee6RuVx4I7ciHx1cw7u/Z5BkK+LTN4zhq7dBvOfdD4/EqStZslKRBUHQCjc9c0PpWsIIDGt/5oKuNkvYsStK9KOmvgzH+H2zTeroO78CTH4/ihzeX8HT4K5w7fJEZa17DO8DT4vhmUY15deEk1sz9i6fbvMz2lbuZtuJl6jYPMY0Z8fL9DHq2L7Oe/ppn208hLzufGWtex8HJwVZpmVT3/NRgr9pxK8eBYszEmBBleiiJXc2fL7qAkvEmSvIAlJSRYIhF4zMPNLY/tmq53UtL/xeITv2Kvy4/RHrBKTrW/A9OOp8brueqr0lLv+dJyt1f7rnfL/Qye+xLmIqiGInN2mCtNCpU3Y+t6pRflZuKRYsWMXnyZKZOncr+/fsJCwujd+/eJCQkWCM+MyPrdubXy7v5/cpeLmQn8MHxFeQbChkQ3LbCdbRomNZyJN+eXUdsTkq554fX6cT8c3+xNfE4Z7PiePPoYvydPOlSo7k1U7FI4zoWchZB7jIwnEHJeAOUXHAZZnkFl2Gg8UZJexoK94MhFgp3Q1H0rW/TioY+P4DV325g7fxNXDpxmVlPfU1+TgG9x/awOH7wc/3Zs+YgSz76lUvRsXz/xiLO7D/H/RP7lI75V39+fGcZO3/dy/kjl3h/1Gz8gn3oOKjifcJaqnt+/5Q9a8etHQcKGJOue5Q5e5n3GxTsAEMMFJ1ByZyBRusBDk2smosljbwf4ULGci5m/kpm4TkOJL6DQcmjjsegG6ylpW2Ndzme8iXZheXP9uYbks0eNd26kZi7h5yiWKvlUZHqfmxVp/yq3FR88sknPPHEE4wZM4ZmzZrx5Zdf4urqyty5c60Rn4leo6OJRy32Jp82LVNQ2JNyhhbeoRWuN6ZBL1ILslgVu6fcc8Euvvg7ebI3pXSb2UV5HE+PoYVXxdu0DgdwaI5SsOO6ZQoU7EDj0NriGhrnHlB4AI3nVDQBO9H4/Q5uT1E6rVXfprXoHfQ0Dq/P/vWlp5sVRWH/+sM0a9/Y4jrNohqzf4P56em9fx7irpLxQfVq4FfThwPrj5iez8nIIfrvMzSLsm1hr+75qcFeteOWjwONK5qATWgCtqDx/gL0DW/8Gi4jUIwZUBh9g3Hq06DH2+kuEnL+vm6pQkLu3/g6t6pwvbt8xpNvSOFi5i83fQ0nnS9Brp24UImxaqvux1Z1y69KTUVBQQH79u2jV69epRvQaunVqxc7d+60uE5+fj4ZGRlmj1vh7eiKXqsjpSDLbHlKfia+Th4W12nlXZeBtdry3vFlFp/3dfQo2UaZbRZkVbhNq9H6oNHoiz8RXc+QXPwdsCW6EHDuA+hQUsehZM9B4zYW3J659W1aiZe/Bzq9jtT4dLPlqQnp+AR5W1zHJ8ibtLLj49PwLRl/7b+p8WnlxvgEWt6mtVT3/P6pqtYOtepG8QvdwnFQdA4lfQpK6tMoaS8CWjS+i0EbZD7OqTuaGgfRBB5F4zYaJWU0KKm3HustcNL5oNXoyTeYn4nNL0rGWedncR0/57up6zmI/YlvVeo1Qj0GUmTM4Ur2X/843qqq7sdWdcuvSk1FUlISBoOBwMBAs+WBgYHExVm++GPGjBl4eXmZHiEhIRbHqc1V58gbLUfw3vFlpBfm2OQ1bU8LxmSUjNeh6Bjk/YGS9QUa1wftHZgQZqpaO+xVN0wKD0LeL1B0Agp3o6RNAGMKGteR5uMKdqEk34eSMgLyt6LxnmWX65WqQq9xJaLG2+xPfIsCY1ql1qnrcT8xWasxKgXWDU7c8ax+S+mUKVNIT083PWJiYm5pO2kFORQZDfg6upst93XyICU/s9z4Wq5+BLv48sHdo9jS61229HqXvsFt6BRwF1t6vUstF19SCjJLtlFmm47uFrdpVcZUFKUItP7my3V+YEysYJ1EKDoPGEuXFZ1Fo6sBONzaNq0kPSkTQ5EBn0Avs+U+NbxIjUuzuE5qXBreZccHepNSMv7af8t23j6B3uU6dGur7vnZmlp1A1DpOCiCouOgq2O+WMkFwyUoPIiS8SpgAJcHbj3WW5BvSMWoFOGkM29mnPR+5BnK38Xm5lAbN4daRAXNZFD9PQyqv4dQjwHUdO3KoPp7cNPXNhvv59waD8d6XMhYYdU8KlLdj63qll+Vmgp/f390Oh3x8fFmy+Pj4wkKCrK4jpOTE56enmaPW1GkGDiZGUu4X+n3mho0RPg25GjapXLjL2Yn8siOTxi9a5bpsS3xBPtTzjF61yzi89K5kptCUn4GEb6l23TVOdHMK4Sj6eW3aV2FUHgMjWPUdcs04NgBpdDyrV0U7AN9neJx1+jroRjii7d3K9u0kqLCIk7tO0frni1LI9FoaN2zJcd3nbK4zvGdp2jdo6XZsja9WnGiZHzc+QSSr6bSumfpbX6uHi40jWzI8Z0nrZBFxap7fv9UVWuHWnWjmBrHgRb0jcF4s4tKtWg0jrcY561RKCIt/wQ1XCOvW6qhhks7UvLK3zKbWXiB9THD+OvySNPjas5mEnP38NflkeQUmZ85qusxiNS846QXWN6Pra26H1vVLb8qNRWOjo6Eh4ezYUPpLUVGo5ENGzYQFRV1gzXV8fOFrdxXqx19g9tQx60GL901GGedA6uu7AXg/1oM56mGxVe/FhiLOJcVb/bILMwlx5DPuax4ihQDAIsvbmNU/R50CriL+u5BvNFyBEn5GWxJuPn93WpTcuaC6whwHgy6Bmg83wSNS/EV64DG6wM07i9cN34haLzReLwOurrg1A2N21MoOT9Wepu2tOzTVfQb15N7HutKaNNaPPfFEzi7ObF23kYAXp4/kbHvPmQav+Kz32nb526GTR5ASJNgHp36AI0jGrBy9prSMbN+56HXhhI1MIK6LUJ5+fuJJF9JZfsv5S/Mlfzsx961o6rHFm4TwbFT8XVL+mZovD4GXS2UnCXFz2tcin8fxuFu0AaDvjkazxmgC0TJW231fMo6nfYDdT0GE+oxEA+HerT2fxWdxoWLmSsBCK/xFs19nwXAqBSQUXDW7FFoyKRIySGj4CwKRabt6jVu1HK/hwuZ9jlLcU11P7aqU35V/jGGyZMnM2rUKCIiImjXrh0zZ84kOzubMWPGWCM+MxviD+Pt6MYTDe7F18mD05lXmLx/LqklF28GOntjVJQqbfOHC5tx1jnySrOhuOudOZx2gcn751JgLLr5ymrL+wNF64vG418lP9BzAiX18dJb2XTBwHX5GeNQUseg8XgNjf8qMMSj5HwP2V9Xfps2tHnxDrwDPBk1fQQ+Qd6cPXiBV/u+Q1pC8QVHNUL9UYyl+R3feYoZD89i9FsPMuadh4g9fZVpgz/gwrHSU+GLPliJs5szk756EndvV45ui2ZK33cozC+U/G4z9qwdVT22NFpP8Hq7eKwxHQqPoSSPAEPJjxEpBtA3QOMyuPgaCmMqFB5BSX4Qiir+wSJric3+E6dkH5r5PI2T3o/0/JNsvzrBdPGmqz4IFONNtlJebffeAMRkrbnJSOuq7sdWdcpPoyhV/FsYmD17Nh9++CFxcXHcfffdfPbZZ0RGRt58RSAjIwMvLy/aLv8XejenKgd8J9jWarm9Q7Cq3sF32zsEcYuKlEI2sZL09PR/+JXCrbnV2nGtbqSeqo+nR/X81wV+yXa/+aA72BeNbnRLrridVaVu3NLPRk6cOJGJEyfeUnBCiP9dUjuEqN6qZ8svhBBCCJuTpkIIIYQQqpCmQgghhBCqkKZCCCGEEKqQpkIIIYQQqpCmQgghhBCqkKZCCCGEEKqQpkIIIYQQqpCmQgghhBCqkKZCCCGEEKqQpkIIIYQQqpCmQgghhBCqkKZCCCGEEKqQpkIIIYQQqpCmQgghhBCqkKZCCCGEEKqQpkIIIYQQqpCmQgghhBCqkKZCCCGEEKqQpkIIIYQQqpCmQgghhBCq0NvrhVOyXNEZne318lbV9Jtn7B2CdS3OtHcEVldn+BF7hyAsCFsxFq1z9awbik+BvUOwqgcO7Ld3CFZ3sLW9I7A/OVMhhBBCCFVIUyGEEEIIVUhTIYQQQghVSFMhhBBCCFVIUyGEEEIIVUhTIYQQQghVSFMhhBBCCFVIUyGEEEIIVUhTIYQQQghVSFMhhBBCCFVIUyGEEEIIVUhTIYQQQghVSFMhhBBCCFVIUyGEEEIIVUhTIYQQQghVSFMhhBBCCFVIUyGEEEIIVUhTIYQQQghVSFMhhBBCCFVIUyGEEEIIVUhTIYQQQghVSFMhhBBCCFXo7R1AVT1UP4LHG3cgwNmd6PR43jq4miOpVyyOvSe4KU817USomy96rZaLWSnMO72TlZeOmMacHPqGxXU/OLKO707ttEoON/JwRBiPR4UT4O5GdHwib63ZyOEr8RbHDm/dgkGtmtEowA+AY1cT+GTjtnLjG/j78mLPTrQLrY1Oq+VsUjITl6ziakam1fMp6+EGZebvwGoOVzB/9wY35cmmnajjXjp/c0+Zz9+pYZbn7/3D9pm/+57pzQMv3odvkDdnD11kznNzObnnTIXjuwxrz6g3RxJUN4DY03F8++8f2L36gNmYUdNH0HdcT9y93Ti2PZrPnvmG2DNx1k6l2nm01d2MbxNBgKsbJ5ISmbb5Lw7FW34fRzZvyZCmzWjs5w/AkYR4Ptq5zWz8+edesLjujG2b+Xr/XvUTuIlHG7fhyeaRBLi4cyI1gam7/+RQ8lWLY3uHNGZCyw7U9fBBr9VyISOVb47vZsX5o2ZjHm7chpZ+Qfg4udBv1XccT02wVTrldPDrTdca9+Gh9+Zq7kV+iZ1LTG7Fx9Y1Yd4deKTO8xxN3833Fz4EQIuOPjVH0tSjDX6ONcg15nAm8wh/XP2RjKJUa6diUXWpHVU+U7FlyxYGDhxIcHAwGo2GX375xQphWda3djOmtLqXOSc2M3jD10Snx/Fdp4fxdXK1OD69IJcvorcyYtNc7lv/FcsvHuTd8PvpFNjANKbjqo/NHlP2rsSoKKyNPWGrtEz6NWvMlHu6MHvLLgZ98yPR8Ul899AQfF1dLI5vV6c2q45G89iCpYyY9zNXMzKZ+/AQAj3cTGNCfLxYOGo455JSeWTBEgZ+vYA5W/8mv6jIVmmZ9CuZv9nHNzNo/ddEp8XxXeeK5y+tMJcvo7cyYuNcBq77imUXDjIjwnz+Ovz2sdnj33uK5+9PO8xf1+EdePLjUfzw5hKeDn+Fc4cvMmPNa3gHeFoc3yyqMa8unMSauX/xdJuX2b5yN9NWvEzd5iGmMSNevp9Bz/Zl1tNf82z7KeRl5zNjzes4ODnYKi1V2LNuAPRv1ITXOndl1t87GfDzAk4kJfL9/UPxc7F8bEXWCuHXU9E8uHwxQ5b8xNWsTP47aCiBbu6mMW2//cLs8dK6NRgVhdVnTtsqLZMBde7i9YiezDq8jf6/z+V4ajz/7TkCP+eKamMec47sYPDq/9Lnt+9YcvYwH3boT5ea9UxjXPWO7E2I4b39G22VRoXCvDswMHgU6+KWMPPUK1zJu8i4+q/hprd8bF3j4xDAgJqPcS7ruNlyR60TtVzqsz5+KTNPv8J/L3xEgFMwo+u9Ys00KlSdakeVm4rs7GzCwsKYM2eONeK5oTGNolh8YT/LLx7ibGYSU/f/Tp6hkKF1WlscvzvpIuuvnORcZhIx2an898xuTqbHE+5X+sYn5WebPXoGN+HvxAtczk6zUValxrRvw+IDR1l+6Dhnk1J44/f15BUWMezuFhbHv/jLGhbuO8yJ+ETOJafy2qp1aDUaouqFmsZM7t6RLWcu8OGGrZyISyQmNZ2/Tp0jJSfXVmmZjGkcxeLzpfP3Rsn8DatbwfwlXmTdlZOcLTt//hXPX6+S+Yuxw/wNfX4Aq7/dwNr5m7h04jKznvqa/JwCeo/tYXH84Of6s2fNQZZ89CuXomP5/o1FnNl/jvsn9ikd86/+/PjOMnb+upfzRy7x/qjZ+AX70HFQW1ulpQp71g2Aca3DWXT0CEtPHONMSgqv/bWO3KJCHmjW0uL45//8gx+OHOJEUiLnUlP494Y/0Wg0dAwpPbaScnLMHvfUb8jOy5eIyUi3VVom45q14+fTh1hy9ghn0pN5bdcacg1FDG/QyuL4XfGXWBtzirMZyVzKSmNe9F6iUxOIqFF6bK04f5TPjmxn+9ULNsqiYl38B/B3ygb2pm4iIf8yyy9/TaFSQDtfy8cWgAYtD9V5jj/jF5NSYH6GJc+Ywzfn3uJw+k4S869wKec0K2K/I8S1Ad4O/tZOp5zqVDuq3FT07duXt99+m8GDB1sjngo5aLQ0967JjoTzpmUKsCPhPK39aldqG+0D6lHPw489SZcsPu/n5EbXoEYsvXDA4vPW5KDV0rxmIDvOl8amADvOX+Lu2jUrtQ0XBz16rY603DwANEDXhvU4n5LKdw8NZufkJ1kydiS9mjS48YasoML5iz/P3ZWcv6gaJfOXeIP5q9mIJedtP396Bz2Nw+uzf/1h0zJFUdi//jDN2je2uE6zqMbs33DYbNnePw9xV8n4oHo18Kvpw4H1pV/35GTkEP33GZpFNbFCFtZjr7oBxcdWixqBbIsxP7a2x1yiTc1KHlt6PQ5aLWl5eRaf93dxpXvdeiw+dtTi89bkoNXSwjeI7XHmx9b2qxdoE1CrUtvoEFSH+l6+7E6wfGzZk06jp5ZrfU5nXndsoXA68zB1XC0fWwD3BA4jqyiDPSl/Vep1XHSuGBUjuYbsfxxzVVS32mH1ayry8/PJz883/TkjI+OWtuPj5IpeqyU5z3zCk/Oyqe9RcWfprndiS//ncdTqMCoK0w/8wY6EcxbHDq4TRnZRgV1Onfu4uqDXaknKyjFbnpSdQ31/n0pt48WenUnIzGLHueLC4OfmiruTI+M7tGXmpu18tGEbnRvUZfYDA3n0v0vYcylW9Twqcm3+ksrMX1J+NvU9bzx/WweUzt+023T+vPw90Ol1pMabf0pNTUgnpKnlwu4T5E1a2fHxafgGeQOY/psan1ZujE+gtxph37bUqhsAPi4lx1ZOmX0vJ4cGPr6V2sYrHbsQn53NtpiLFp8feldzsgsLWHPW9l99mI6tXPPakZiXTQMvvwrX83BwYtfQiTjqio+t1/9ey7bb4KxEWW46D3QaHVlF5sdKVlE6NZwsH1t13ZrS1rcHn556qVKvodc40K/mIxxM206+0bZncatb7bB6UzFjxgymT59u7ZepUHZRPoPWf4Wr3pGoGvX4d6t7iclOZXdS+eIwtO7d/HbpCAVGgx0i/WfGd2hL/+ZNePS/SygwFMev1WgA2HDqLPP/Lv70fiI+kdYhNXkwvJVNm4pblV2Uz/3rvsKtZP6mXJu/xPLzN+wOnj9hzt5143pPhbdjYOMmPLhssenYKuuBZi1YeTK6wudvR1mF+fT7fS5uegc6BNXl/yJ6EpOVxq742+9sRVU4aZ15MORZll7+khzDzS9G16LjkTqTAVh++Rtrh1ftWf2W0ilTppCenm56xMTE3NJ2UvNzKDIa8XN2M1vu5+xGUl5WhespwKXsVKLT45l3ehdrY48zvmmncuPC/UKp7+HPEjt89QGQmpNLkdGIv7v5hVX+bq4kljl7UdbY9uGM7xjB2B+XczIhyWybhQYDZxKTzcafTUqhpteNL3BS27X58y8zf/5ObiRWYv5OpMczt2T+nmxSfv4i/EOp7+lvl68+ANKTMjEUGfAJ9DJb7lPDi9S4NIvrpMal4V12fKA3KSXjr/237CcLn0Dvcp9Aqhu16gZAam7JseVaZt9zdSUx58anup9oHcHTEW157JdlRCcnWRzTNrgWDXx9WXTsiMXnrc10bLmY144AZzcSc298bF3MTOV4agLfntjNHxejeaZFlJWjrbpsQyYGxYC73vxYcdd7kVmUVm68n2MQvk41GFPv37zX6mfea/UzbXy60Mwzgvda/YyfY6BprBYdj9adjI+jP9+ce8vmZymg+tUOqzcVTk5OeHp6mj1uRaFi5FjaVaICSq9O1gBRAfU4kHy50tvRajQ4anXllg+rezdHU69wMt3y7ZvWVmg0cuxqPFF1Sy+U0gBR9UI4eNnybWEA46IimNA5kscXruDoVfPYC41GjlyJp76f+Sneer4+XEm/9dPJt8I0fzXKzF+Nehyswvxp0OCoszx/R1KuEG2n+SsqLOLUvnO07ll64Z9Go6F1z5Yc33XK4jrHd56idQ/zCwXb9GrFiZLxcecTSL6aSuuepRfqunq40DSyIcd3nrRCFrcPteoGFB8HRxPizS6y1AAdQkLZf7XiY+vJNm2Z2K49o1Yu50hCxfvV8GYtOBwfx4mkxFuO8Z8oNBo5mhJHh6C6pmUaiq+T2J9Y+bORFdVGezMoRcTmnKOhx3XHFhoaurfkYk75YyshP5aPTk7m01MvmR7HM/ZyNusYn556ibTC4g9Z1xoKf8cgvj77FjmGihswa6puteOO+vGread3MrxeGwaFtqK+hz/TWvfHRe/A8osHAXg/4n4mNy+9WnZ8k450qFGf2m7e1PfwZ0yj9twX2opfL5l/onDTO9KndjO7fcq9Zt6u/Qxv05LBrZrRwN+X6f164uLgwLJDxwD44P7evNCjo2n8Ex0imNQtiim//UlsWgb+bq74u7ni6lB6y9B3O/fSt3ljhrduQaiPF49EhNG9cX0W7j1k+/xOFc/f4DqtaODhz/Q2xfO37MJBAD5oez8vtCidvydL5i/EzZsGHv6MbdSe++u04teLFcyfnc4yXbPs01X0G9eTex7rSmjTWjz3xRM4uzmxdl7xLXkvz5/I2HcfMo1f8dnvtO1zN8MmDyCkSTCPTn2AxhENWDl7TemYWb/z0GtDiRoYQd0Wobz8/USSr6Sy/Zc9Ns/vTvbtgX2m355o4OPL29174ap3YOnx4gsrP76nDy91KD0D9mR4W56P6sAr69dyOSMdf1dX/F3Njy0Ad0dH+jVqYrezFNd8e3w3Dza6m6H1W9LA0493Ivvgqndgydnii/k+7jCAl1t3NY1/pkUUnWrWJcTdmwaefoy7qx2D67dgxfljpjFejs4086lBQ6/ia57qe/rRzKcGAWXONtrClqRVRPr2JNynKzWcajGk9hM4ap3Yk1J8bI0MmUjfoOJjq0gpJD4vxuyRZ8gh35hLfF4MBqUILToeq/sCtV3qs/DSZ2g1Wjz03njovdFpbP/zTdWpdlT53cvKyuLMmdIf5Dh//jwHDx7E19eX0NDQG6z5z62+fBxfJzeea9aNAGd3TqTHM27bQpLzi09h1nT1wqgopvGuOkemtu5LkIsneYYizmUm8dKeFay+bH7Pcv+QFmjQsCrG9lduX++P46fwdXXhua5RBLi7ciI+kccXriA5u/jrj5qeHmb5PRjeCke9ntkPDDTbzuebd/L5ll0ArDt5lqm/b+DJjm15vXd3zien8OyS39gXY/kHp6zpDwvz9/gN5s9F78i01n0Jcr1u/nav4I8y8zfg2vxdsu/8bV68A+8AT0ZNH4FPkDdnD17g1b7vkJZQfEFVjVB/FGNpfsd3nmLGw7MY/daDjHnnIWJPX2Xa4A+4cKz0VP+iD1bi7ObMpK+exN3blaPbopnS9x0K8wttnt8/Yc+6AfD76ZP4ubgwuX1H/N1cOZGYyOiVy0wXNwZ7eJrte4+0DMNJp+eL/veZbWfm3zuY9Xfpj6oNbNQEDfDbqWir53Ajqy6ewNfZlefDOhPg4saJ1ARG/bWYpLzi/Gq5eaJw/bHlwFvtelPT1YM8QxFn05N5fttvrLpYepHzPbUb8VHHAaY/z+4yCICZh7Yy8/A22yRW4lDaDtx0nvQOGoGH3psruRf49vw7pos3vR39zfK7GS8HX5p7Fd9aObnJR2bPfXFmKueyj1tazWqqU+3QKIpS+ZkANm3aRPfu3cstHzVqFPPnz7/p+hkZGXh5edHgv1PQuTpX5aXvGMpxD3uHYF132f6XOG2tznD7fvK0liKlkE2sJD09/R99pVBVatWN0PffRutcTeuGT4G9Q7CqB1rtt3cIVnfQ8k/u3PGqUjeqfKaiW7duVLEPEUL8j5O6IcT/hjvqmgohhBBC3L6kqRBCCCGEKqSpEEIIIYQqpKkQQgghhCqkqRBCCCGEKqSpEEIIIYQqpKkQQgghhCqkqRBCCCGEKqSpEEIIIYQqpKkQQgghhCqkqRBCCCGEKqSpEEIIIYQqpKkQQgghhCqkqRBCCCGEKqSpEEIIIYQqpKkQQgghhCqkqRBCCCGEKqSpEEIIIYQqpKkQQgghhCqkqRBCCCGEKqSpEEIIIYQq9PZ6YeetHugcne318laV1jbf3iFYlfcWD3uHYHWx/+5g7xCswpCfB5+stHcYt0yfrUFr0Ng7DKswFjjZOwSrWry7rb1DsDr3lxzsHYJVGPLzYFbl6oacqRBCCCGEKqSpEEIIIYQqpKkQQgghhCqkqRBCCCGEKqSpEEIIIYQqpKkQQgghhCqkqRBCCCGEKqSpEEIIIYQqpKkQQgghhCqkqRBCCCGEKqSpEEIIIYQqpKkQQgghhCqkqRBCCCGEKqSpEEIIIYQqpKkQQgghhCqkqRBCCCGEKqSpEEIIIYQqpKkQQgghhCqkqRBCCCGEKqSpEEIIIYQqpKkQQgghhCqkqRBCCCGEKvT2DqCqRnQJY1TPcPw93TgVm8h7SzZy9GK8xbFDOrRgYLtmNAz2A+D4pQQ+/22b2fieYQ15oFMr7gqtgbebC8Nn/MDJ2ESb5GLJY03aML5FJAEubpxISWDq7nUcSrpqcWyf0MZMaBlFHU8fHDRazmem8s2x3aw4d8zi+Hfa9+aRJq2Zvns9c0/stWYaFRrROYxRPa6bv6UbOXqpgvmLKpm/miXzF1Myf9eN79mqZP5CSubvffvO34PtwxjbORx/dzdOxiXyzm8bOXLZcn7DIlpwf5tmNAwsyS82gZl/bqtw/NT7ezIishUzVm1iwY4DVsuhunq4TRjjIiMIcHcjOiGRN//cyOGrcRbHDg9ryaCWd9HY3x+Ao3HxfLJ5e4Xj3+zdkwfbhPHO+o3M32OfuXnk7jCeaBtBgJsbJxITmb5hI4fjLMc7omVLBje/Lr/4eD7aur3c+Aa+vrzcpTORIbXRabWcSU7mmZW/cTUz0+r5lPVYs9aMb9WutDbuWM+hRMv5jWzSiqGNm9PEJwCAI0lxfLBni9l4fxdX/t2uK11q1cPTyYm/r8YwdccGLmSk2iSfsh6MCmNMl3D8Pdw4eTWRd1feoHa0a8F9ZWrHrDXmtaNX84YMb9+K5rWKa+PQmT8QfdX6tbFKZypmzJhB27Zt8fDwoEaNGgwaNIiTJ09aK7ZyerdpzIuDu/DV6l2MfP9HTsYm8cWEIfi6u1gcH9GoNqv3RTNu1lIe/fhn4tMy+WLCEGp4uZnGuDg6cOBsLDN/2WarNCo0oG5TXm/bg1mHtjHgt3mcSE1gQa8R+Dm7Whyflp/H7CM7GfLHAnr/NpclZ47wUcf+dAmuV25s79DGtA4IJi7H9sXAFEPrkvlbs4uRH5bM3zOVmL/Pl/LoJz8Tn5rJF8+UmT8nBw6ci2Xmr/afvz4tG/NKvy78Z8Muhs35keirSXw9Zgi+bpbza1e/Nr8fimbMt0t56MufiUvP5JsxQ6jh6VZubM9mDQgLCSI+PcvaaViFvWtHv7sa82rPrszetotBc3/gRHwic0cMwdfV8txE1qnNquMneXThEob/9yfiMjOZN3IIge7u5cbe07ghd9eqSVym/eamf5PGvNqtK5/t3MV9C34gOiGR+cOG4FdRfiG1+S36JA8vWsKwhT9xNTOT74eZ5xfq5cWiB0dwLiWFhxYtpv/8/zJ75y4KDEW2SstkQP2mvN6+O7P2b2fAiu85kZzIgr7DK6yNUcGh/HrmBCNX/czglT9wJSuTBX2HE+hamt839wwm1MObcX8up9/y74nNyuDHfsNx0TvYKi2TPq0a8/KA4trxwGc/cvJqEl89XnHtaFu/Nn8cjGbs10t5+D/FtePrcea1w8XRgQMXYvlktW1rY5Wais2bNzNhwgR27drFunXrKCws5N577yU7O9ta8Zl5tEcblu84yspdxzkXl8LbP68nr6CIQVEtLI5/9fs1LN56mJOxiVyIT2Xaj+vQajS0axJqGrNqzwm+WvM3f5+8ZJMcbmRcs3b8fPoQS84c4XR6Mq/uXEOuoZDhDVtZHL8r/hJrL53iTHoylzLTmHdiL9GpCbStUdtsXKCrO9Pb9eJfW3+j0Gi0RSoWPdq9ZP7+Lpm/xSXz176C+fvvGhZvK5m/hFSm/bQOrVZDu8a35/yN7tSGJXuOsmL/cc4mpDB9ZXF+Q8It5/fy4jX8/Pdhoq8mcj4xlf9bXrx/tm8Qajauhqcbrw3szsuL11BkNNgiFdXZu3aMbRfOokNHWXbkGGeSU3hjzXpyi4oY1sry3Lzw62oW7j/EiYREzqWk8uofxXMTVTfEbFyguztv3NOdyb+upshgv7kZGxHOoiNHWXa0OL/X160nt7CIYS0s5zf5j9X8ePAQJxKL85uydh0ajYYOoaX5vdC5I5vOnef9LVs5npDIpfR0Npw9R3JOrq3SMhnXMoKfow+z5NRRTqcl8+q2teQWFTK8SUuL4/+1cRULThzkeEoCZ9NTeGXrGrQaDR1r1QGgnpcPbQJr8dr2PzmcFMe59BRe2/Ynzno99ze4y5apATCqcxuW7j7KL3tLaseK9eQVFjGkreX5e+XnNfy8q7R2vLG0pHY0LK0dvx04wRcb/mbnGdvWxio1FWvWrGH06NE0b96csLAw5s+fz6VLl9i3b5+14jPR67TcFRLIruv+8lAU2HXyEq3q1azUNpwd9eh1OjJy8qwV5i1z0Gpp6RfEtisXTMsUYNuVC7QJqFWpbXQMqkN9T1/+jo8xLdMAMzsN5KtjuzmdlqRu0FWg2vxpb9P502lpFhzIrjPm+e08e4m7QyuZn0Px/pl+XX4aDbz3QB/mbt3HmYRk1eO2FXvWDgetluZBgew4f9G0TAF2XLhI61qVmxsXh+J9Lz3vurkBPhzYh2//3suZJPvNjYNWS4vAQHZcLJPfpYu0Dq5kfno9DlodaSX5aYBu9etzITWVeUOHsPuZp1j28IPc07CBFTK4MQetlpb+QWyLvWBapgDbYi/SpkZwpbbhonfAQaslLb84P0etDoD8otJGUAEKDAYigipXb9XioNPSrFYgO0+XqY1nLhH2D2qHvfyjCzXT09MB8PX1rXBMfn4+GRkZZo9b4ePugl6nJTkzx2x5ckYO/p6WT4GVNen+ziSmZ7Er2v6fasvycXJFr9WSlGf+yS0pL5sAl/Knw6/xcHDi+EOTOfPoS8zt9QBTd69n29ULpuefbtGeIsXIPDtdQ3GNj1sF85eZg79HJefvvs4kZmSZNSa3C2/X4vySssrkl1X5/F7o05mEjCx2ni3Nb1yXthiMCj9Us2soblY71KobAD6uLsXHVk6ZucnOIcC94mPrei9170xCVhbbz5fOzfiothgUI9/vte/c+LiU5Jdtnl9Sdg4BbpXL7+WunYnPzmL7xeL8/FxdcXd05MnIdmy5cIFRS5bx5+kz/Of++2hXu/ZNtqYuH+eS2phbJr/cbAJcK5fflHZdic/JYntJY3I2LYXLmem80q4Lno5OOGi1PBXWjmB3T2q4lv+Ky5qu1Y7ksrWjCrXxhX4ltcPGZyUsueULNY1GI5MmTaJjx460qOAUGxR/lzp9+vRbfRnVjL2nLX3Cm/D4rCUUFN2Zp5AtySrMp+9vc3HTO9KxZl1eb9uDS5lp7Iq/RAvfQMY0i6D/b/PtHeY/NrZXW/q0acLjn1ev+btmXJe29GvVhFHflubXLLgGj3ZozdDZP9o5OnVVpnbcLnUDYHz7tvS/qymP/LiYgpKvOJoH1WBURBsGzfvBztH9c0+2a8uAJk15aFFpflqNBoD1Z84yb99+AE4kJtImOJiHwlqx+/Jlu8VbVU+HRTKwflNG/P4z+SX5FSlGnlz/Cx906cORUf+iyGhkW+wFNl46i6Yk9zvFuG5t6RvWhNFf3R618ZabigkTJnD06FG2bbvxRSBTpkxh8uTJpj9nZGQQEhJygzUsS83KpchgxK9M5+bn6UpSRk4FaxV7rGc4Y+6J4MnZyzl9xX5fAdxIan4ORUYj/s7mnbe/sxuJuRV/76wAFzPTADiemkBDLz+eadmeXfGXaBcYgr+zGzuHPWMar9dqeT2iB2ObtaXTsi+skYpFqdkVzJ+HK0mZN5m/HuGM6RXBk3Nu3/lLyynOz9+9TH7uN89vTKdwxnWN4PG5yzkVV5pfeN1a+Lq5suHlcaZlep2Wl/t14bGOrbnnw7nqJmEjlakdatUNgNSc3OJjy7XM3Li5kph142s6Hm8XzpNRbRn10zJOJpbOTduQWvi5ubJ5whOmZXqtln/36MqoiDZ0/+K7W4r1VqTmluTnZp6fv5sriTe5ZmVcRDhPtWvLY0uWcTKpNL/U3FwKDQbOJJt/rXM2JYWIWpX7ykEtqXkltdGlTH4ubiTm3Di/8S3b8nRYJA//sZjoFPM7H44mxdNv+fd4ODjioNORkpfLL/c/wpEK7iixlmu1w69s7ahEbRzdJZzHu0Uw7hvz2mFPt9RUTJw4kVWrVrFlyxZq3+RUmJOTE05OTrcU3PWKDEZOxMQT2SSEjYfPAsXfN0c2DuHnLYcqXG90rwjG9W7H03OWc7yCWxdvB4VGI0eS4+hYsy5/xpwGir/X7FizDt9H76/0drQaDY664mldfu6o2VchAAvuGcHys0dZcuaIWqFXimn+Goew8ch189fkJvPXM4Jx97bj6S+WczzmNp4/g5HjV+Jp3zCEDSdK82vfIISFOyvOb2znCJ7s3o4n5i3nWKx5fr8eOGH2VQjAN6OH8OvBE6zYZ/m24dtdZWuHWnUDio+tY3HxRNUNZf3pkrkBOtQJZcG+gxWu90RkBE93iGTsouUcjTOfm1+OnjD7KgRg7sihrDx6nGWHbTs3hUYjR+Pj6RAayrozpflFhYay4MDBCtcb3zaCZ9pHMnrpco7Em+dXaDRyJC6eej4+Zsvr+fgQm2HbO8gKjUaOJMXRsVYd/rx4BiipjcF1+P54xbXxyVbtmNg6isdWL+ZIUsWNQmZhARRCXU8fWvkH8fFe294tUWgwcjy2uHb8dfy62tgwhJ923KB2dI1gfI92jP+ufO2wpyo1FYqi8Oyzz7JixQo2bdpEvXrlb120pgV/7eetR3tz7FICRy/E8Uj31rg4OfDLruKD+O1He5OQnsVnv24HYEyvCJ7pH8W/v1/NleQM06fknPxCcgsKAfB0daKmjycBJbcp1g0sPoiSMrLLff9vbd8e383HnQZwOPkqh5KuMvauCFz1jiw5cxiATzoNIC4nkw/2bwbgmRbtOZwcx8XMVJx0errXasDgBs15fddaoPiW02sXJl1TaDSSmJvNuYwUm+YGsGDjft56pDfHYhI4ejGOR7q1xsXRgV/+Lpm/R0rm77fr5q9fFeevhv3mb/62/cwY1pujlxM4cjmOxzoW57dif3F+M4b1JiEji0//LM7v8S4RPNsripcWreZKaobpLEdOQSE5BYWk5+aRnms+f0VGA0mZ2VxIss+99LfK3rVj7u59fDCgD0fj4jl8JY7Rbdvg4uBgagA+GNCH+MwsPt5c/BfK+PZt+VfnKCb/uprL6emmswA5BYXkFBaSlptHWtm5MRhIys7mfIrt52bu3n182LcPR+LjOXQ1jjHhbXB1cGDp0eL8Purbh7isLD7aWpJfu7ZM6hDF87+X5FdyFiensDg/gG/27GXWwP7suRzLrpgYutSrS48G9Xlo0WKb5/ftkb183LUfhxPjOJR4lbEtInB1cGDJqeIPR59060dcdhYf7NkCwFNh7Zgc3ol//bWKy5kZpuvSsgsLyCkqzq9fvSak5OUQm5VBU98Apkb15M+Lp9l63QWhtvL91v28O7w3x0pqx6OdWuPi4MCKvcXz9+7w4toxc01J7egawcR7o3j5p9VcSSlfOwC8XJyo6e1JQMltpnUDSmpjZna5a7/UVKWmYsKECSxcuJCVK1fi4eFBXMkPpXh5eeHiYvl+WjWt3X8KH3cXnukfhb+HKydjE3lmzgpSSv7yCPL1wKgopvEPdG6Fo4OeT8YNNNvOF3/s5Ms/dgHQrWUD3nq0t+m5D8b2LzfGVlZdiMbP2ZXJd3cmwMWN4ykJPLZ+EUl5xfkFu3ma5efq4MDb7e+lpqsHeYYizqYnM2nrb6y6EG3TuCtr7YGS+esXhb+nKycvJ/LMF9fNn0+Z+evYCke9nk8eLzN/q3fy5eqS+WvRgLceuW7+xvQvN8ZW1hw5ha+bC8/2Kt4/o68m8uS8FaYLsGp6m+c3MrI4v1kPm+c3Z8NO5mywbezWZu/a8ceJU/i6uvKvzh0IcHPlREIijy9eTnLJxZvBnh4o183Ng62L52b2EPO5+WzrTj7fttPq8VbV7yeL85vUsQP+rq6cSExkzNLS/Gp6mu97D4e1wkmv5z/3m+c3a8dOPttRnN+fZ87wf+vW83RkO97o0Z1zqSlMWPkb+2Kv2C6xEqvORePn7MLk8E4EuLpxPDmBx1YvMV28WbY2PnJXa5x0er68Z5DZdj7dt52Z+4v/Yq7h6sb/te+Ov4sbCTlZLD99jM8O7LBZTtdbc7i4dky8t6R2XEnkybnmteP6/XNE++L9c+ajZWrHup38Z31x7ejerAHvDC+tjR8/3L/cGGvQKNdHerPBFVzAMm/ePEaPHl2pbWRkZODl5UXzJ95F5+hc2Ze+o6S1zbd3CFblvU+d09K3s0LbXgBuM4b8PE598irp6el4enra7HX/ae24Vjfqv/EOWufqWTeMtv/NJZsq8rL9j2bZmvuZ6jmJhvw8Ts6qXN2o8tcfQghRVVI7hPjfIP+gmBBCCCFUIU2FEEIIIVQhTYUQQgghVCFNhRBCCCFUIU2FEEIIIVQhTYUQQgghVCFNhRBCCCFUIU2FEEIIIVQhTYUQQgghVCFNhRBCCCFUIU2FEEIIIVQhTYUQQgghVCFNhRBCCCFUIU2FEEIIIVQhTYUQQgghVCFNhRBCCCFUIU2FEEIIIVQhTYUQQgghVCFNhRBCCCFUIU2FEEIIIVSht/ULKooCgKEgz9YvbTPG3Hx7h2BVhgLF3iFYnaGaTqEhv/i4u3Yc3imuxWvMr8Z1w2DvCKzL6Fhk7xCszpBfPSexKnVDo9i4uly+fJmQkBBbvqQQooyYmBhq165t7zAqTeqGEPZXmbph86bCaDRy5coVPDw80Gg0Vn+9jIwMQkJCiImJwdPT0+qvZ2uS353N1vkpikJmZibBwcFotXfOt59SN9Ql+d3Zbue6YfOvP7RarV0+IXl6elbLnesaye/OZsv8vLy8bPI6apK6YR2S353tdqwbd85HFSGEEELc1qSpEEIIIYQqqn1T4eTkxNSpU3FycrJ3KFYh+d3Zqnt+d6rqPi+S353tds7P5hdqCiGEEKJ6qvZnKoQQQghhG9JUCCGEEEIV0lQIIYQQQhXSVAghhBBCFdJUCCGEEEIV0lQIIYQQQhXSVAghhBBCFdJUCCGEEEIV/w9KzsrMA7fWJAAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 4 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "print('-'*50)\n",
    "# mask\n",
    "mask = torch.Tensor([[0, 0, 1, 1], [0, 0, 0, 1], [0, 0, 0, 0]]).reshape(1, 1, 3, 4) #手工构造mask\n",
    "outputs_masked = mha(query, key_value, key_value, mask)\n",
    "\n",
    "fig, axis = plt.subplots(*outputs_masked.attn_scores.shape[:2])\n",
    "for i in range(query.shape[0]):\n",
    "    for j in range(outputs_masked.attn_scores.shape[1]):\n",
    "        axis[i, j].matshow(outputs_masked.attn_scores[i, j].detach().numpy())\n",
    "        for x in range(outputs_masked.attn_scores.shape[2]):\n",
    "            for y in range(outputs_masked.attn_scores.shape[3]):\n",
    "                axis[i, j].text(y, x, f\"{outputs_masked.attn_scores[i, j, x, y]:.2f}\", ha=\"center\", va=\"center\", color=\"w\")\n",
    "fig.suptitle(\"multi head attention with mask\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "GkzzrRWVN4yE"
   },
   "source": [
    "#### Transformer-Block"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:25.527550400Z",
     "start_time": "2024-08-05T08:06:25.524551200Z"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T01:56:07.785251Z",
     "iopub.status.busy": "2025-02-07T01:56:07.785039Z",
     "iopub.status.idle": "2025-02-07T01:56:07.795330Z",
     "shell.execute_reply": "2025-02-07T01:56:07.794509Z",
     "shell.execute_reply.started": "2025-02-07T01:56:07.785230Z"
    },
    "id": "b16xpL47N4yE"
   },
   "outputs": [],
   "source": [
    "# 通过使用 @dataclass 装饰器，Python 会自动为该类生成一些方法，如 __init__()、__repr__() 和 __eq__() 等，这些方法可以使类的使用更加方便。\n",
    "@dataclass\n",
    "class TransformerBlockOutput:\n",
    "# hidden_states: Tensor：用于存储某个块产生的隐藏状态。\n",
    "# self_attn_scores: Tensor：包含了自注意力机制（self-attention）所计算得到的注意力分数。\n",
    "# cross_attn_scores: Optional[Tensor] = None：是一个可选字段，存储了交叉注意力（cross-attention）计算得到的注意力分数。这里的 Optional 表示这个字段可以是 Tensor 类型，也可以是 None。\n",
    "    hidden_states: Tensor\n",
    "    self_attn_scores: Tensor\n",
    "    cross_attn_scores: Optional[Tensor] = None\n",
    "\n",
    "class TransformerBlock(nn.Module):\n",
    "    def __init__(self, config, add_cross_attention=False):\n",
    "        super().__init__()\n",
    "        # hyper params\n",
    "        self.hidden_size = config[\"d_model\"]\n",
    "        self.num_heads = config[\"num_heads\"]\n",
    "        dropout_rate = config[\"dropout\"]\n",
    "        ffn_dim = config[\"dim_feedforward\"]\n",
    "        eps = config[\"layer_norm_eps\"] # 层归一化的epsilon值\n",
    "\n",
    "        # self-attention\n",
    "        self.self_atten = MultiHeadAttention(config) # 多头注意力\n",
    "        self.self_ln = nn.LayerNorm(self.hidden_size, eps=eps) #层归一化(层标准化)\n",
    "        self.self_dropout = nn.Dropout(dropout_rate)\n",
    "\n",
    "        # cross-attention，交叉注意力，decoder中使用,因此额外做一个判断\n",
    "        if add_cross_attention:\n",
    "            self.cross_atten = MultiHeadAttention(config)\n",
    "            self.cross_ln = nn.LayerNorm(self.hidden_size, eps=eps)\n",
    "            self.cross_dropout = nn.Dropout(dropout_rate)\n",
    "        else:\n",
    "            self.cross_atten = None\n",
    "\n",
    "        # FFN,前馈神经网络\n",
    "        self.ffn = nn.Sequential(\n",
    "            nn.Linear(self.hidden_size, ffn_dim),\n",
    "            nn.ReLU(),\n",
    "            nn.Linear(ffn_dim, self.hidden_size),\n",
    "        )\n",
    "        self.ffn_ln = nn.LayerNorm(self.hidden_size, eps=eps)\n",
    "        self.ffn_dropout = nn.Dropout(dropout_rate)\n",
    "\n",
    "    def forward(\n",
    "        self,\n",
    "        hidden_states,\n",
    "        attn_mask=None,\n",
    "        encoder_outputs=None,\n",
    "        cross_attn_mask=None,\n",
    "    ):\n",
    "        # self-attention,自注意力\n",
    "        self_atten_output = self.self_atten(\n",
    "            hidden_states, hidden_states, hidden_states, attn_mask\n",
    "        )\n",
    "        self_embeds = self.self_ln(\n",
    "            hidden_states + self.self_dropout(self_atten_output.hidden_states)\n",
    "        ) #多头注意力进行dropout，然后和原始输入进行残差连接，然后进行层归一化\n",
    "\n",
    "        # cross-attention，交叉注意力\n",
    "        if self.cross_atten is not None:\n",
    "            assert encoder_outputs is not None\n",
    "            cross_atten_output = self.cross_atten(\n",
    "                self_embeds, encoder_outputs, encoder_outputs, cross_attn_mask\n",
    "            ) #query是self_embeds，key和value都是encoder_outputs\n",
    "            cross_embeds = self.cross_ln(\n",
    "                self_embeds + self.cross_dropout(cross_atten_output.hidden_states)\n",
    "            ) # 交叉注意力进行dropout，然后和self_embeds进行残差连接，然后进行层归一化\n",
    "\n",
    "        # FFN\n",
    "        embeds = cross_embeds if self.cross_atten is not None else self_embeds # 如果有交叉注意力，则使用交叉注意力的输出作为FFN的输入；否则，使用self_embeds作为FFN的输入\n",
    "        ffn_output = self.ffn(embeds) # 前馈神经网络\n",
    "        embeds = self.ffn_ln(embeds + self.ffn_dropout(ffn_output)) # 前馈神经网络进行dropout，然后和原始输入进行残差连接，然后进行层归一化\n",
    "\n",
    "        return TransformerBlockOutput(\n",
    "            hidden_states=embeds,\n",
    "            self_attn_scores=self_atten_output.attn_scores,\n",
    "            cross_attn_scores=cross_atten_output.attn_scores\n",
    "            if self.cross_atten is not None\n",
    "            else None,\n",
    "        )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "tfJIGaohN4yE"
   },
   "source": [
    "#### Encoder"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:25.527550400Z",
     "start_time": "2024-08-05T08:06:25.525550800Z"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T01:56:07.799298Z",
     "iopub.status.busy": "2025-02-07T01:56:07.798873Z",
     "iopub.status.idle": "2025-02-07T01:56:07.804573Z",
     "shell.execute_reply": "2025-02-07T01:56:07.804105Z",
     "shell.execute_reply.started": "2025-02-07T01:56:07.799277Z"
    },
    "id": "sTLabHm7N4yE"
   },
   "outputs": [],
   "source": [
    "from typing import List\n",
    "\n",
    "@dataclass\n",
    "class TransformerEncoderOutput:\n",
    "    last_hidden_states: Tensor\n",
    "    attn_scores: List[Tensor]\n",
    "\n",
    "# https://pytorch.org/docs/stable/generated/torch.nn.Module.html#torch.nn.Module\n",
    "class TransformerEncoder(nn.Module):\n",
    "    def __init__(self, config):\n",
    "        super().__init__()\n",
    "        # hyper params\n",
    "        self.num_layers = config[\"num_encoder_layers\"]\n",
    "\n",
    "        # layers,仅仅是一个模块的列表，它本身没有定义前向传递（forward pass）过程。你需要在 forward 方法中明确地定义如何使用这些模块。\n",
    "        self.layers = nn.ModuleList(\n",
    "            [TransformerBlock(config) for _ in range(self.num_layers)]\n",
    "        )\n",
    "\n",
    "    def forward(\n",
    "        self, encoder_inputs_embeds, attn_mask=None\n",
    "    ) -> TransformerEncoderOutput:\n",
    "        attn_scores = [] # 存储每个层的注意力分数\n",
    "        embeds = encoder_inputs_embeds # 输入的嵌入向量作为第一层的输入(embedding+位置编码)\n",
    "        for layer in self.layers:\n",
    "            block_outputs = layer(embeds, attn_mask=attn_mask)\n",
    "            embeds = block_outputs.hidden_states #上一层的输出作为下一层的输入\n",
    "            # 在每个层的输出中，提取了隐藏状态 block_outputs.hidden_states，并将对应的注意力分数 block_outputs.self_attn_scores 添加到列表 attn_scores 中。\n",
    "            attn_scores.append(block_outputs.self_attn_scores) # 存储每个层的注意力分数,用于画图\n",
    "\n",
    "        return TransformerEncoderOutput(\n",
    "            last_hidden_states=embeds, attn_scores=attn_scores\n",
    "        )\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "BEMNj6eBN4yE"
   },
   "source": [
    "#### Decoder"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:25.527550400Z",
     "start_time": "2024-08-05T08:06:25.525550800Z"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T01:56:07.805282Z",
     "iopub.status.busy": "2025-02-07T01:56:07.805099Z",
     "iopub.status.idle": "2025-02-07T01:56:07.811377Z",
     "shell.execute_reply": "2025-02-07T01:56:07.810849Z",
     "shell.execute_reply.started": "2025-02-07T01:56:07.805259Z"
    },
    "id": "wCHOur-QN4yE"
   },
   "outputs": [],
   "source": [
    "@dataclass\n",
    "class TransformerDecoderOutput:\n",
    "    last_hidden_states: Tensor\n",
    "    self_attn_scores: List[Tensor]\n",
    "    cross_attn_scores: List[Tensor]\n",
    "\n",
    "\n",
    "class TransformerDecoder(nn.Module):\n",
    "    def __init__(self, config):\n",
    "        super().__init__()\n",
    "        # hyper params\n",
    "        self.num_layers = config[\"num_decoder_layers\"]\n",
    "\n",
    "        # layers\n",
    "        self.layers = nn.ModuleList(\n",
    "            [\n",
    "                TransformerBlock(config, add_cross_attention=True)\n",
    "                for _ in range(self.num_layers)\n",
    "            ]\n",
    "        )\n",
    "\n",
    "    def forward(\n",
    "        self,\n",
    "        decoder_inputs_embeds,\n",
    "        encoder_outputs,\n",
    "        attn_mask=None,\n",
    "        cross_attn_mask=None,\n",
    "    ) -> TransformerDecoderOutput:\n",
    "        self_attn_scores = [] # 存储每个层的自注意力分数\n",
    "        cross_attn_scores = [] # 存储每个层的交叉注意力分数\n",
    "        embeds = decoder_inputs_embeds # 输入的嵌入向量作为第一层的输入(embedding+位置编码)\n",
    "        for layer in self.layers:\n",
    "            block_outputs = layer(\n",
    "                embeds,\n",
    "                attn_mask=attn_mask, # 自注意力的mask\n",
    "                encoder_outputs=encoder_outputs,\n",
    "                cross_attn_mask=cross_attn_mask, # 交叉注意力的mask\n",
    "            )\n",
    "            embeds = block_outputs.hidden_states # 上一层的输出作为下一层的输入\n",
    "            self_attn_scores.append(block_outputs.self_attn_scores) # 存储每个层的自注意力分数\n",
    "            cross_attn_scores.append(block_outputs.cross_attn_scores) # 存储每个层的交叉注意力分数\n",
    "\n",
    "        return TransformerDecoderOutput(\n",
    "            last_hidden_states=embeds,\n",
    "            self_attn_scores=self_attn_scores,\n",
    "            cross_attn_scores=cross_attn_scores,\n",
    "        )\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "zPrvXAXtN4yF"
   },
   "source": [
    "#### mask\n",
    "\n",
    "- mask实际上大类上只有两种\n",
    "    1. `padding_mask`：mask掉`pad_idx`，不计算损失\n",
    "    2. `attention_mask`：mask掉`pad_idx`，不计算注意力分数\n",
    "- Decoder的`attention_mask`和Encoder有一定的区别：\n",
    "    - Encoder可以同时看见序列所有信息，故只mask掉`pad_idx`\n",
    "    - Decoder只能看到在自身之前的序列的信息，故要额外mask掉自身之后的序列"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:25.527550400Z",
     "start_time": "2024-08-05T08:06:25.526551200Z"
    },
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T01:56:07.812278Z",
     "iopub.status.busy": "2025-02-07T01:56:07.811975Z",
     "iopub.status.idle": "2025-02-07T01:56:07.818492Z",
     "shell.execute_reply": "2025-02-07T01:56:07.817993Z",
     "shell.execute_reply.started": "2025-02-07T01:56:07.812259Z"
    },
    "id": "D2N9VmcAWLn1",
    "outputId": "560b8af9-c854-4fd7-df3e-86e9eb9045cc"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[False,  True,  True,  True,  True],\n",
       "        [False, False,  True,  True,  True],\n",
       "        [False, False, False,  True,  True],\n",
       "        [False, False, False, False,  True],\n",
       "        [False, False, False, False, False]])"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(torch.triu(torch.ones(5, 5)) == 0).transpose(-1,-2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:26.193720900Z",
     "start_time": "2024-08-05T08:06:25.526551200Z"
    },
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 426
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T01:56:07.819241Z",
     "iopub.status.busy": "2025-02-07T01:56:07.819053Z",
     "iopub.status.idle": "2025-02-07T01:56:07.980885Z",
     "shell.execute_reply": "2025-02-07T01:56:07.980295Z",
     "shell.execute_reply.started": "2025-02-07T01:56:07.819221Z"
    },
    "id": "QxpSYOsaN4yF",
    "outputId": "1022d3c3-c72e-4798-b998-c71c6690b94e"
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 480x480 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "\n",
    "def generate_square_subsequent_mask(sz: int) -> Tensor:\n",
    "    \"\"\"\n",
    "    Generate a square mask for the sequence. The masked positions are filled with True.\n",
    "        Unmasked positions are filled with False.\n",
    "    \"\"\"\n",
    "    # torch.ones(sz, sz): 创建一个全为 1 的 sz × sz 的矩阵。\n",
    "    # torch.triu(...): 使用 triu 函数取得矩阵的上三角部分，将主对角线以下部分置零。\n",
    "    mask = (torch.triu(torch.ones(sz, sz)) == 0).transpose(-1, -2).bool()\n",
    "    # mask = torch.triu(torch.ones(sz, sz))\n",
    "    return mask\n",
    "\n",
    "\n",
    "plt.matshow(generate_square_subsequent_mask(16))\n",
    "plt.colorbar()\n",
    "plt.xlabel(\"keys\")\n",
    "plt.ylabel(\"querys\")\n",
    "plt.title(\"1 means mask while 0 means unmask\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:27.178084Z",
     "start_time": "2024-08-05T08:06:25.538543600Z"
    },
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 960
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T01:56:07.981948Z",
     "iopub.status.busy": "2025-02-07T01:56:07.981708Z",
     "iopub.status.idle": "2025-02-07T01:56:08.477681Z",
     "shell.execute_reply": "2025-02-07T01:56:08.477053Z",
     "shell.execute_reply.started": "2025-02-07T01:56:07.981923Z"
    },
    "id": "cPeMjXO1N4yF",
    "outputId": "e6922ce8-ba71-491f-d7a6-709a14a4b7d7"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['[BOS]', '[UNK]', 'quick', 'brown', '[UNK]', 'jumps', 'over', 'the', '[UNK]', 'dog', '.', '[EOS]']\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA1IAAAG1CAYAAADz+MUUAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAASMZJREFUeJzt3X1cVHX+///ncCEiyECGGkpeYWamqUhayoV5gVSu1q5iZoraupm22mptfmxTu5A1s/pWm+Zamkapu2vZthmkiXhV6iaJpa6GEshaXjKocX1+f/Rz1hFUDsLMAI/77XZuwZkz7/frDM68es45c8ZiGIYhAAAAAEClebi6AAAAAACobQhSAAAAAGASQQoAAAAATCJIAQAAAIBJBCkAAAAAMIkgBQAAAAAmEaQAAAAAwCSCFAAAAACYRJACAAAAAJMIUsBlLFu2TBaLRUeOHHFYP3/+fLVt21aenp7q2rWrS2qrD2bPni2LxaITJ064uhQAKOdyPaK6JCQkyN/fv0bGrsiF/dm1a5fT5ryaC32gtqKP1X0EKcCElJQUPfnkk+rdu7eWLl2quXPnVuv427Zt0+zZs3XmzJlyt82dO1cfffRRtc4HAACAqiFIASZ88cUX8vDw0Ntvv63Ro0fr7rvvrtbxt23bpjlz5hCkAAAA3BxBCjDhp59+kq+vrxo0aODqUgAAAOBCBCnUOfn5+Zo6dapat24tHx8fNW3aVAMGDNDXX39t3+arr77SoEGDZLVa1ahRI0VHR2vr1q1XHNdisWjp0qU6d+6cLBaLLBaLli1bVqma9uzZo4SEBLVt21YNGzZU8+bNNW7cOJ08edK+zezZs/XEE09Iktq0aWOf48iRI7JYLDp37pzeffdd+/qEhAT7/SwWiw4dOqSEhAQFBgbKarVq7NixOn/+vKnH7sI5+T/88IPuvfde+fv7q0WLFvrLX/4iScrIyNBdd90lPz8/tWrVSu+//77D/U+dOqXp06erc+fO8vf3V0BAgOLi4vTNN9+Um+v1119Xp06d1KhRIwUFBalHjx7lxrtUVlaWwsLCdOutt+rHH380tW8AUNPefPNNderUST4+PgoJCdGkSZMqPMPgb3/7m8LDw+Xr66vrr79eo0aN0tGjR686fnp6uoKDgxUTE6OzZ89WqqasrCw9+uij6tChg3x9fdWkSRMNGzbssp/tKiws1B/+8AcFBwfLz89P9913n44fP15uu3Xr1ikyMlJ+fn5q3Lix7rnnHn377bcO21Sm912wZcsWRUREqGHDhmrXrp3eeuutSu3fpehjcCYvVxcAVLdHHnlEf//73zV58mTdcsstOnnypLZs2aJ9+/ape/fu+uKLLxQXF6fw8HDNmjVLHh4eWrp0qe666y5t3rxZt99+e4XjrlixQosXL9aOHTu0ZMkSSdKdd95ZqZo+//xzZWZmauzYsWrevLm+/fZbLV68WN9++62+/PJLWSwW3X///frPf/6jDz74QK+88oquv/56SVJwcLBWrFihhx9+WLfffrsmTJggSWrXrp3DHMOHD1ebNm2UmJior7/+WkuWLFHTpk01b948U49faWmp4uLiFBUVpRdffFFJSUmaPHmy/Pz8NHPmTD344IO6//77tWjRIo0ePVp33HGH2rRpI0nKzMzURx99pGHDhqlNmzb68ccf9dZbbyk6OlrfffedQkJCJEl//etf9fvf/16/+c1vNGXKFBUUFGjPnj366quvNHLkyArr+v7773XXXXfpuuuu0+eff25/fADAHcyePVtz5sxR//79NXHiRB04cEALFy7Uzp07tXXrVnl7e0v65aIOY8eOVUREhBITE/Xjjz/q//2//6etW7dq9+7dCgwMrHD8nTt3KjY2Vj169NDatWvl6+tbqbp27typbdu2acSIEWrZsqWOHDmihQsXKiYmRt99950aNWrksP1jjz2moKAgzZo1S0eOHNGrr76qyZMna9WqVfZtVqxYoTFjxig2Nlbz5s3T+fPntXDhQvXp00e7d+9W69atJVWu90m/hJuBAwcqODhYs2fPVklJiWbNmqVmzZqZ/Cv8gj4GpzGAOsZqtRqTJk2q8LaysjKjffv2RmxsrFFWVmZff/78eaNNmzbGgAED7OuWLl1qSDIOHz5sXzdmzBjDz8/PdE3nz58vt+6DDz4wJBlpaWn2dfPnzy835wV+fn7GmDFjyq2fNWuWIckYN26cw/r77rvPaNKkiak6x4wZY0gy5s6da193+vRpw9fX17BYLMbKlSvt6/fv329IMmbNmmVfV1BQYJSWljqMefjwYcPHx8d49tln7euGDBlidOrU6Yq1XNiv48ePG/v27TNCQkKMiIgI49SpU6b2CQBqwsU94qeffjIaNGhgDBw40OE18I033jAkGe+8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",
      "text/plain": [
       "<Figure size 1000x500 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "--------------------------------------------------\n",
      "['[BOS]', '[UNK]', 'does', 'the', '[UNK]', 'say', '?', '[EOS]', '[PAD]', '[PAD]', '[PAD]', '[PAD]']\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA1AAAAG1CAYAAAD3DRUpAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAR7tJREFUeJzt3XtcVHX+x/E3iAKCM1jhhSBTM80yLbz9VGTE5NJlKfNuq6ibm9qGpW766OKtJCPTLlvKumkXNzOl2s1IvOElLW1T0U1dy0sgWpoK3kAu5/fHPphlAvGAODPA6/l4zGOZM2e+n89hhXcfzswZD8MwDAEAAAAArsjT1Q0AAAAAQHXBAAUAAAAAJjFAAQAAAIBJDFAAAAAAYBIDFAAAAACYxAAFAAAAACYxQAEAAACASQxQAAAAAGASAxQAAAAAmMQABZRh8eLF8vDw0OHDhx22JyYmqkWLFqpTp446dOjgkt5qg2nTpsnDw0MnT550dSsAUMrlMqKqxMXFyd/f/5qsXZbi4/n222+dVvNKinOguiLHajYGKMCk1NRU/fnPf1b37t21aNEizZo1q0rX37Jli6ZNm6YzZ86UemzWrFn69NNPq7QeAAAAKo4BCjBp3bp18vT01N/+9jcNGzZM9957b5Wuv2XLFk2fPp0BCgAAwI0xQAEm/fLLL/L19VW9evVc3QoAAABchAEKNcrZs2c1fvx43XzzzfL29lajRo3Up08ffffdd/Z9vvnmG0VHR8tqtap+/foKDw/XV199Ve66Hh4eWrRokc6fPy8PDw95eHho8eLFpnpKT09XXFycWrRoIR8fHzVp0kQjR47Ur7/+at9n2rRpmjRpkiSpefPm9hqHDx+Wh4eHzp8/r3fffde+PS4uzv48Dw8P/fDDD4qLi1NAQICsVqtGjBihCxcuVOh7V/ya+59++kn333+//P39deONN+ovf/mLJGn37t2KiIiQn5+fmjVrpr///e8Ozz916pQmTpyodu3ayd/fXxaLRTExMdq1a1epWm+88YZuv/121a9fXw0bNlTHjh1LrfdbR44c0S233KI77rhDP//8c4WODQCutbfeeku33367vL29FRQUpHHjxpX5ioKPP/5YoaGh8vX11Q033KBHHnlER48eveL6O3fuVGBgoGw2m86dO2eqpyNHjmjs2LFq3bq1fH19df3116t///6Xfe9WXl6ennrqKQUGBsrPz08PPfSQTpw4UWq/lJQUhYWFyc/PTw0aNNB9992nf//73w77mMm+Yps3b1anTp3k4+Ojli1basGCBaaO77fIMTiLl6sbAKrSY489puXLl+vxxx9X27Zt9euvv2rz5s3au3ev7r77bq1bt04xMTEKDQ3V1KlT5enpqUWLFikiIkKbNm1S586dy1z3/fffV1JSkrZt26aFCxdKkrp162aqp9WrV+vgwYMaMWKEmjRpon//+99KSkrSv//9b3399dfy8PBQ37599Z///Ecffvih5s6dqxtuuEGSFBgYqPfff19/+MMf1LlzZ40ePVqS1LJlS4caAwYMUPPmzZWQkKDvvvtOCxcuVKNGjTR79uwKff8KCwsVExOjnj176uWXX9aSJUv0+OOPy8/PT88884yGDh2qvn37av78+Ro2bJj+7//+T82bN5ckHTx4UJ9++qn69++v5s2b6+eff9aCBQsUHh6u77//XkFBQZKkv/71r3riiSfUr18/xcfHKzc3V+np6frmm280ZMiQMvv68ccfFRERoeuuu06rV6+2f38AwB1MmzZN06dP1z333KMxY8Zo//79evvtt7V9+3Z99dVXqlu3rqT/XqxhxIgR6tSpkxISEvTzzz/rtdde01dffaUdO3YoICCgzPW3b9+uqKgodezYUZ999pl8fX1N9bV9+3Zt2bJFgwYNUnBwsA4fPqy3335bNptN33//verXr++w/5/+9Cc1bNhQU6dO1eHDhzVv3jw9/vjj+uijj+z7vP/++xo+fLiioqI0e/ZsXbhwQW+//bZ69OihHTt26Oabb5ZkLvuk/w41kZGRCgwM1LRp01RQUKCpU6eqcePGFfx/4b/IMTiFAdQgVqvVGDduXJmPFRUVGa1atTKioqKMoqIi+/YLFy4YzZs3N/r06WPftmjRIkOScejQIfu24cOHG35+fhXu6cKFC6W2ffjhh4YkY+PGjfZtiYmJpWoW8/PzM4YPH15q+9SpUw1JxsiRIx22P/TQQ8b1119foT6HDx9uSDJmzZpl33b69GnD19fX8PDwMJYuXWrfvm/fPkOSMXXqVPu23Nxco7Cw0GHNQ4cOGd7e3saMGTPs22JjY43bb7+93F6Kj+vEiRPG3r17jaCgIKNTp07GqVOnKnRMAHAtlMyIX375xahXr54RGRnp8DvwzTff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PfXBBx/owQcf1IABA/TFF1+U+ustALhKYGCgpkyZounTpys6Olq/+93vtH//fr311lvq1KmTHnnkEUlS3bp1NXv2bI0YMULh4eEaPHiw/TLmN998s5588sky1/f19dXnn3+uiIgIxcTEaMOGDbrjjjtM9Xb//ffr/fffl9VqVdu2bbV161atWbNG119/faWO1WKx6O2339bvf/973X333Ro0aJACAwP1008/aeXKlerevbvefPPNCmXf9OnT9eWXXyosLExjx45VQUGB/TOW0tPTK9VnZZFjMM01F/8Dql5eXp4xadIko3379kaDBg0MPz8/o3379sZbb73lsN+OHTuMvn37Gtdff73h7e1tNGvWzBgwYICxdu1a+z5VeRnzzMxM46GHHjICAgIMq9Vq9O/f38jKyip1+VTDMIyZM2caN954o+Hp6elQf9++fUbPnj0NX19fQ5L9kuYlL5NaUln9X8nlji88PLzMy7U2a9bMuO++++z3c3NzjQkTJhhNmzY1fH19je7duxtbt241wsPDjfDwcPt+CxYsMHr27Gn//rds2dKYNGmSkZ2dbd+nrOO6cOGCER4ebvj7+xtff/216eMCgKpW1u/YN99802jTpo1Rt25do3HjxsaYMWOM06dPl3ruRx99ZNx1112Gt7e3cd111xlDhw41MjMzHfYp6/fxyZMnjbZt2xpNmjQxDhw4YKrP06dPGyNGjDBuuOEGw9/f34iKijL27dtnNGvWzOGjMYqPZ/v27Q7PX79+vSHJWL9+fantUVFRhtVqNXx8fIyWLVsacXFxxrfffmvfpyLZt2HDBiM0NNSoV6+e0aJFC2P+/Pn2HKgIcgzO4mEYFXyXOQAAAADUUrwHCgAAAABM4j1QQCVlZ2fr4sWL5e5T1mVena269AkAMOfcuXNlXgyppMDAwMteuru6IcfgbngJH1BJcXFxevfdd8vdxx1+vKpLnwAAc6ZNm1bq84Z+69ChQ7r55pud09A1Ro7B3TBAAZX0/fffKysrq9x9nPV5U+WpLn0CAMw5ePCgDh48WO4+PXr0cPg8ouqMHIO7YYACAAAAAJO4iAQAAAAAmMQABQAAAAAmMUDBbs+ePYqLi3NqzcOHDys1NVWS1LFjR6fWrq2++eYbde/eXXfffbc++OADV7cDAJflilySyCZXIJtQnTBAlZCWlqaQkBAlJSXJ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",
      "text/plain": [
       "<Figure size 1000x500 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "--------------------------------------------------\n"
     ]
    }
   ],
   "source": [
    "#通过下面代码查看mask的效果\n",
    "inputs_words = [\"The quick brown fox jumps over the lazy dog .\", \"What does the fox say ?\"]\n",
    "\n",
    "inputs_ids, input_mask = tokenizer.encode([w.split() for w in inputs_words], return_mask=True)\n",
    "for i in range(len(inputs_words)):\n",
    "    decode_text = tokenizer.decode(inputs_ids[i: i+1].tolist(), remove_bos=False, remove_eos=False, remove_pad=False, split=True)[0]\n",
    "    print(decode_text)\n",
    "    self_attn_mask  = input_mask[i].reshape(1, -1).repeat_interleave(inputs_ids.shape[-1], dim=0)\n",
    "    look_ahead_mask = generate_square_subsequent_mask(inputs_ids.shape[-1])\n",
    "\n",
    "    fig, axs = plt.subplots(1, 2, figsize=(10, 5))\n",
    "    axs[0].matshow(self_attn_mask)\n",
    "    axs[0].set_title(\"self_attn_mask\")\n",
    "    axs[0].set_yticks(range(len(decode_text)), decode_text, fontsize=6)\n",
    "    axs[0].set_ylabel(\"querys\")\n",
    "    axs[0].set_xticks(range(len(decode_text)), decode_text, fontsize=6)\n",
    "    axs[0].set_xlabel(\"keys\")\n",
    "    axs[1].matshow(look_ahead_mask)\n",
    "    axs[1].set_title(\"look_ahead_mask\")\n",
    "    axs[1].set_yticks(range(len(decode_text)), decode_text, fontsize=6)\n",
    "    axs[1].set_ylabel(\"querys\")\n",
    "    axs[1].set_xticks(range(len(decode_text)), decode_text, fontsize=6)\n",
    "    axs[1].set_xlabel(\"keys\")\n",
    "    plt.show()\n",
    "    print('-'*50)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:27.179078300Z",
     "start_time": "2024-08-05T08:06:26.513547400Z"
    },
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2025-02-07T01:56:08.479082Z",
     "iopub.status.busy": "2025-02-07T01:56:08.478490Z",
     "iopub.status.idle": "2025-02-07T01:56:08.484889Z",
     "shell.execute_reply": "2025-02-07T01:56:08.484206Z",
     "shell.execute_reply.started": "2025-02-07T01:56:08.479047Z"
    },
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[False,  True,  True,  True,  True],\n",
       "        [False, False,  True,  True,  True],\n",
       "        [False, False, False,  True,  True],\n",
       "        [False, False, False, False,  True],\n",
       "        [False, False, False, False, False]])"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(torch.triu(torch.ones(5, 5)) == 0).transpose(-1, -2).bool()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:27.234057200Z",
     "start_time": "2024-08-05T08:06:27.159090100Z"
    },
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2025-02-07T01:56:08.486013Z",
     "iopub.status.busy": "2025-02-07T01:56:08.485639Z",
     "iopub.status.idle": "2025-02-07T01:56:08.490977Z",
     "shell.execute_reply": "2025-02-07T01:56:08.490329Z",
     "shell.execute_reply.started": "2025-02-07T01:56:08.485984Z"
    },
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([5, 1, 4, 4])"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#帮我随机两个[5, 1, 1, 4]与[1, 1, 4, 4]尺寸的张量，并求和\n",
    "a = torch.randn(5, 1, 1, 4)\n",
    "b = torch.randn(1, 1, 4, 4)\n",
    "(a + b).shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "TelCDOoEN4yF"
   },
   "source": [
    "#### Transformer Model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:27.234057200Z",
     "start_time": "2024-08-05T08:06:27.160089800Z"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T01:56:08.492092Z",
     "iopub.status.busy": "2025-02-07T01:56:08.491816Z",
     "iopub.status.idle": "2025-02-07T01:56:08.646600Z",
     "shell.execute_reply": "2025-02-07T01:56:08.646017Z",
     "shell.execute_reply.started": "2025-02-07T01:56:08.492064Z"
    },
    "id": "oFGNt8FPN4yF"
   },
   "outputs": [],
   "source": [
    "@dataclass\n",
    "class TransformerOutput:\n",
    "    logits: Tensor\n",
    "    encoder_last_hidden_states: Tensor\n",
    "    encoder_attn_scores: List[Tensor] #画图\n",
    "    decoder_last_hidden_states: Tensor\n",
    "    decoder_self_attn_scores: List[Tensor] #画图\n",
    "    decoder_cross_attn_scores: List[Tensor] #画图\n",
    "    preds: Optional[Tensor] = None\n",
    "\n",
    "class TransformerModel(nn.Module):\n",
    "    def __init__(self, config):\n",
    "        super().__init__()\n",
    "        # hyper params\n",
    "        self.hidden_size = config[\"d_model\"]\n",
    "        self.num_encoder_layers = config[\"num_encoder_layers\"]\n",
    "        self.num_decoder_layers = config[\"num_decoder_layers\"]\n",
    "        self.pad_idx = config[\"pad_idx\"]\n",
    "        self.bos_idx = config[\"bos_idx\"]\n",
    "        self.eos_idx = config[\"eos_idx\"]\n",
    "        self.vocab_size = config[\"vocab_size\"]\n",
    "        self.dropout_rate = config[\"dropout\"]\n",
    "        self.max_length = config[\"max_length\"]\n",
    "        self.share = config[\"share_embedding\"]\n",
    "\n",
    "        # layers\n",
    "        self.src_embedding = TransformerEmbedding(config) # 输入的嵌入层\n",
    "        if self.share:#如果共享词嵌入，则使用src_embedding作为trg_embedding\n",
    "            self.trg_embedding = self.src_embedding #源和目标的嵌入层相同，共享参数，节省内存\n",
    "            self.linear = lambda x: torch.matmul(\n",
    "                x, self.trg_embedding.get_word_embedding_weights().T\n",
    "            ) # 输出层，共享参数，直接拿原有embedding矩阵的转置，节省内存\n",
    "        else:\n",
    "            self.trg_embedding = TransformerEmbedding(config) #decoder模块的嵌入层\n",
    "            self.linear = nn.Linear(self.hidden_size, self.vocab_size) # 输出层\n",
    "\n",
    "        self.encoder = TransformerEncoder(config)\n",
    "        self.decoder = TransformerDecoder(config)\n",
    "\n",
    "        # init weights\n",
    "        self._init_weights()\n",
    "\n",
    "    def _init_weights(self):\n",
    "        \"\"\"使用 xavier 均匀分布来初始化权重\"\"\"\n",
    "        for p in self.parameters():\n",
    "            if p.dim() > 1:\n",
    "                nn.init.xavier_uniform_(p)\n",
    "\n",
    "    def generate_square_subsequent_mask(self, sz: int) -> Tensor:\n",
    "        \"\"\"\n",
    "        Generate a square mask for the sequence. The masked positions are filled with True.\n",
    "            Unmasked positions are filled with False.为了生成斜三角的mask\n",
    "        \"\"\"\n",
    "        mask = (torch.triu(torch.ones(sz, sz)) == 0).transpose(-1, -2).bool()\n",
    "\n",
    "        return mask\n",
    "\n",
    "    def forward(\n",
    "        self, encoder_inputs, decoder_inputs, encoder_inputs_mask=None\n",
    "    ) -> TransformerOutput:\n",
    "        # encoder_inputs: [batch_size, src_len]\n",
    "        # decoder_inputs: [batch_size, trg_len]\n",
    "        # encoder_inputs_mask: [batch_size, src_len]\n",
    "        if encoder_inputs_mask is None:\n",
    "            encoder_inputs_mask = encoder_inputs.eq(self.pad_idx) # [batch_size, src_len]\n",
    "        encoder_inputs_mask = encoder_inputs_mask.unsqueeze(1).unsqueeze(\n",
    "            2\n",
    "        )  # [batch_size, 1, 1, src_len],用于encoder的自注意力\n",
    "        look_ahead_mask = self.generate_square_subsequent_mask(decoder_inputs.shape[1])\n",
    "        look_ahead_mask = (\n",
    "            look_ahead_mask.unsqueeze(0).unsqueeze(0).to(decoder_inputs.device)\n",
    "        )  #[trg_len, trg_len]--> [1, 1, trg_len, trg_len],用于decoder的自注意力\n",
    "        #增加decoder_inputs_mask和look_ahead_mask进行组合\n",
    "        decoder_inputs_mask = decoder_inputs.eq(self.pad_idx) # [batch_size, trg_len]，和上面encoder_inputs_mask一致\n",
    "        # print(decoder_inputs_mask.shape)\n",
    "        decoder_inputs_mask = decoder_inputs_mask.unsqueeze(1).unsqueeze(2)  # [batch_size, 1, 1, trg_len]\n",
    "        # print(decoder_inputs_mask.shape)\n",
    "        decoder_inputs_mask = decoder_inputs_mask + look_ahead_mask # [batch_size, 1, 1, trg_len]与[1, 1, trg_len, trg_len]相加，得到decoder的自注意力mask\n",
    "\n",
    "        # encoding\n",
    "        encoder_inputs_embeds = self.src_embedding(encoder_inputs)\n",
    "        encoder_outputs = self.encoder(encoder_inputs_embeds, encoder_inputs_mask) #encoder_inputs_mask用于encoder的自注意力,广播去做计算\n",
    "\n",
    "        # decoding\n",
    "        decoder_inputs_embeds = self.trg_embedding(decoder_inputs)\n",
    "        decoder_outputs = self.decoder(\n",
    "            decoder_inputs_embeds=decoder_inputs_embeds,\n",
    "            encoder_outputs=encoder_outputs.last_hidden_states,\n",
    "            attn_mask=decoder_inputs_mask, #用于decoder的自注意力,广播去做计算\n",
    "            cross_attn_mask=encoder_inputs_mask,#用于decoder的交叉注意力,广播去做计算\n",
    "        )\n",
    "\n",
    "        logits = self.linear(decoder_outputs.last_hidden_states) # [batch_size, trg_len, vocab_size]\n",
    "\n",
    "        return TransformerOutput(\n",
    "            logits=logits,\n",
    "            encoder_last_hidden_states=encoder_outputs.last_hidden_states,\n",
    "            encoder_attn_scores=encoder_outputs.attn_scores,\n",
    "            decoder_last_hidden_states=decoder_outputs.last_hidden_states,\n",
    "            decoder_self_attn_scores=decoder_outputs.self_attn_scores,\n",
    "            decoder_cross_attn_scores=decoder_outputs.cross_attn_scores,\n",
    "        )\n",
    "\n",
    "    @torch.no_grad()\n",
    "    def infer(self, encoder_inputs, encoder_inputs_mask=None) -> Tensor:\n",
    "        # assert len(encoder_inputs.shape) == 2 and encoder_inputs.shape[0] == 1\n",
    "        if encoder_inputs_mask is None:#应对多个样本同时进行推理\n",
    "            encoder_inputs_mask = encoder_inputs.eq(self.pad_idx)\n",
    "        encoder_inputs_mask = encoder_inputs_mask.unsqueeze(1).unsqueeze(2)  # [batch_size, 1, 1, src_len],[1,src_len]相加时，会自动广播到[batch_size,1,src_len,src_len]\n",
    "        look_ahead_mask = self.generate_square_subsequent_mask(self.max_length)\n",
    "        look_ahead_mask = (\n",
    "            look_ahead_mask.unsqueeze(0).unsqueeze(0).to(encoder_inputs.device)\n",
    "        )  # [1, 1, trg_len, trg_len]\n",
    "\n",
    "        # encoding\n",
    "        encoder_inputs_embeds = self.src_embedding(encoder_inputs)\n",
    "        encoder_outputs = self.encoder(encoder_inputs_embeds) #因为只支持单样本预测，没有paddings，所以不需要mask\n",
    "\n",
    "        # decoding,多样本推理\n",
    "        decoder_inputs = torch.Tensor([self.bos_idx] * encoder_inputs.shape[0]).reshape(-1, 1).long().to(device=encoder_inputs.device)\n",
    "        for cur_len in tqdm(range(1, self.max_length + 1)):\n",
    "            decoder_inputs_embeds = self.trg_embedding(decoder_inputs)\n",
    "            decoder_outputs = self.decoder(\n",
    "                decoder_inputs_embeds=decoder_inputs_embeds,\n",
    "                encoder_outputs=encoder_outputs.last_hidden_states,\n",
    "                attn_mask=look_ahead_mask[:, :, :cur_len, :cur_len],#decoder的自注意力mask\n",
    "            )\n",
    "\n",
    "            logits = self.linear(decoder_outputs.last_hidden_states)\n",
    "            next_token = logits.argmax(dim=-1)[:, -1:] #通过最大下标确定类别，[:, -1:]表示取最后一个结果\n",
    "            decoder_inputs = torch.cat([decoder_inputs, next_token], dim=-1) #预测输出拼接到输入中\n",
    "            #(decoder_inputs == self.eos_idx).sum(dim=-1)是判断样本中是否含有EOS标记\n",
    "            #all是每一个都为True，才会结束\n",
    "            if all((decoder_inputs == self.eos_idx).sum(dim=-1) > 0):\n",
    "                break\n",
    "\n",
    "        return TransformerOutput(\n",
    "            preds=decoder_inputs[:, 1:],\n",
    "            logits=logits,\n",
    "            encoder_last_hidden_states=encoder_outputs.last_hidden_states,\n",
    "            encoder_attn_scores=encoder_outputs.attn_scores,\n",
    "            decoder_last_hidden_states=decoder_outputs.last_hidden_states,\n",
    "            decoder_self_attn_scores=decoder_outputs.self_attn_scores,\n",
    "            decoder_cross_attn_scores=decoder_outputs.cross_attn_scores,\n",
    "        )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "kXHQ3sGTN4yG"
   },
   "source": [
    "## 训练"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "OxNA8DIzN4yG"
   },
   "source": [
    "### 损失函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:27.234057200Z",
     "start_time": "2024-08-05T08:06:27.160089800Z"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T01:56:08.647899Z",
     "iopub.status.busy": "2025-02-07T01:56:08.647402Z",
     "iopub.status.idle": "2025-02-07T01:56:08.652556Z",
     "shell.execute_reply": "2025-02-07T01:56:08.651931Z",
     "shell.execute_reply.started": "2025-02-07T01:56:08.647863Z"
    },
    "id": "1xzahHANN4yG"
   },
   "outputs": [],
   "source": [
    "class CrossEntropyWithPadding:\n",
    "    def __init__(self, config):\n",
    "        self.label_smoothing = config[\"label_smoothing\"]\n",
    "\n",
    "    def __call__(self, logits, labels, padding_mask=None):\n",
    "        # logits.shape = [batch size, sequence length, num of classes]\n",
    "        # labels.shape = [batch size, sequence length]\n",
    "        # padding_mask.shape = [batch size, sequence length]\n",
    "        bs, seq_len, nc = logits.shape\n",
    "        loss = F.cross_entropy(logits.reshape(bs * seq_len, nc), labels.reshape(-1), reduce=False, label_smoothing=self.label_smoothing) #label_smoothing表示随机将一个类别的概率设置为0.1，使得模型更加关注其他类别\n",
    "        if padding_mask is None:\n",
    "            loss = loss.mean()\n",
    "        else:\n",
    "            padding_mask = 1 - padding_mask.reshape(-1) #将padding_mask reshape成一维张量，mask部分为0，非mask部分为1\n",
    "            loss = torch.mul(loss, padding_mask).sum() / padding_mask.sum()\n",
    "\n",
    "        return loss\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "zuBC9KqFN4yG"
   },
   "source": [
    "### 学习率衰减"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:27.235056800Z",
     "start_time": "2024-08-05T08:06:27.160089800Z"
    },
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2025-02-07T01:56:08.653703Z",
     "iopub.status.busy": "2025-02-07T01:56:08.653300Z",
     "iopub.status.idle": "2025-02-07T01:56:08.772558Z",
     "shell.execute_reply": "2025-02-07T01:56:08.771924Z",
     "shell.execute_reply.started": "2025-02-07T01:56:08.653672Z"
    },
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x7f08b5ac7190>]"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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YrEwbdo0Xn75ZXr27Em3bt148cUX6dixI6NGjaq/mYqIiEijZXdhiY+P58yZM8yePZucnBwiIiJYv3591UWz2dnZuLn964mbYcOGsXTpUl544QVmzZpFz549Wb16Nf37968a89xzz1FcXMwTTzzBhQsXuOWWW1i/fj0+PrpmREREROrwPizOqiHfh0VEREQaRoO8D4uIiIiII6iwiIiIiNNTYRERERGnp8IiIiIiTk+FRURERJyeCouIiIg4PRUWERERcXoqLCIiIuL0VFhERETE6dn91vzO6rs37C0sLHRwEhEREamt787b13vjfZcpLEVFRQAEBwc7OImIiIjYq6ioCH9//6ve7zKfJWSz2Th16hS+vr5YLJZ6e9zCwkKCg4M5fvy4S35GkavPD1x/jq4+P3D9OWp+jZ+rz7Eh52eMoaioiI4dO1b78OTvc5lnWNzc3OjcuXODPb6fn59L/hB+x9XnB64/R1efH7j+HDW/xs/V59hQ87vWMyvf0UW3IiIi4vRUWERERMTpqbBch7e3N3PmzMHb29vRURqEq88PXH+Orj4/cP05an6Nn6vP0Rnm5zIX3YqIiIjr0jMsIiIi4vRUWERERMTpqbCIiIiI01NhEREREaenwnIdixcvJiQkBB8fH6Kjo9m6daujI13h17/+NRaLpdotNDS06v7S0lImTpxI27ZtadmyJQ8++CC5ubnVHiM7O5uRI0fSvHlz2rdvz/Tp06msrKw2ZuPGjURFReHt7U2PHj14++23G2Q+X3zxBffccw8dO3bEYrGwevXqavcbY5g9ezYdOnSgWbNmxMbGcuDAgWpjzp07x9ixY/Hz86NVq1Y89thjXLx4sdqYHTt2cOutt+Lj40NwcDC///3vr8iycuVKQkND8fHxISwsjHXr1t2QOf7sZz+74pjeeeedjWaOSUlJDB48GF9fX9q3b8+oUaPYt29ftTE38ueyvn+PazO/22+//Ypj+OSTTzaK+QG88cYbDBgwoOqNwmJiYvj444+r7m/Mx68282vsx+/75s6di8ViYdq0aVXbGt0xNHJVy5cvN15eXuavf/2r2bVrl3n88cdNq1atTG5urqOjVTNnzhzTr18/c/r06arbmTNnqu5/8sknTXBwsElJSTHbtm0zQ4cONcOGDau6v7Ky0vTv39/ExsaajIwMs27dOhMQEGBmzpxZNebw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QECAycvLM8Zcfulaly5dzGeffWa2bdtmYmJiTExMTNX+37107Y477jCZmZlm/fr1pl27djW+dG369Olmz549ZvHixQ32suaioiKTkZFhMjIyDGBee+01k5GRYY4dO2aMufyy5latWpkPP/zQ7Nixw9x33301vqw5MjLSfPPNN+bLL780PXv2rPaS3wsXLpjAwEDz6KOPmqysLLN8+XLTvHnzK17y6+HhYebNm2f27Nlj5syZU28va77WHIuKisyzzz5rUlNTzZEjR8ynn35qoqKiTM+ePU1paWmjmONTTz1l/P39zcaNG6u9LLSkpKRqzI36uWyI3+Prze/gwYPmN7/5jdm2bZs5cuSI+fDDD0337t3Nbbfd1ijmZ4wxM2bMMJs2bTJHjhwxO3bsMDNmzDAWi8X885//NMY07uN3vfm5wvGryfdf+dTYjqEKy3UsWrTIdOnSxXh5eZkhQ4aYr7/+2tGRrhAfH286dOhgvLy8TKdOnUx8fLw5ePBg1f2XLl0yv/zlL03r1q1N8+bNzf33329Onz5d7TGOHj1q7rrrLtOsWTMTEBBgnnnmGVNRUVFtzOeff24iIiKMl5eX6d69u3nrrbcaZD6ff/65Aa64jR8/3hhz+aXNL774ogkMDDTe3t5mxIgRZt++fdUe4+zZsyYhIcG0bNnS+Pn5mQkTJpiioqJqY7Zv325uueUW4+3tbTp16mTmzp17RZZ3333X9OrVy3h5eZl+/fqZjz76qMHnWFJSYu644w7Trl074+npabp27Woef/zxK365nXmONc0NqPYzcyN/Luv79/h688vOzja33XabadOmjfH29jY9evQw06dPr/Y+Hs48P2OM+fnPf266du1qvLy8TLt27cyIESOqyooxjfv4XW9+rnD8avL9wtLYjqHFGGPse05GRERE5MbSNSwiIiLi9FRYRERExOmpsIiIiIjTU2ERERERp6fCIiIiIk5PhUVEREScngqLiIiIOD0VFhEREXF6KiwiIiLi9FRYRERExOmpsIiIiIjTU2ERERERp/d/WvhGRCRCR7sAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "x=np.arange(1, 40000)\n",
    "plt.plot(x, x * (4000 ** (-1.5)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:27.235056800Z",
     "start_time": "2024-08-05T08:06:27.161089200Z"
    },
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2025-02-07T01:56:08.773877Z",
     "iopub.status.busy": "2025-02-07T01:56:08.773362Z",
     "iopub.status.idle": "2025-02-07T01:56:08.778137Z",
     "shell.execute_reply": "2025-02-07T01:56:08.777595Z",
     "shell.execute_reply.started": "2025-02-07T01:56:08.773842Z"
    },
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "22.627416997969522"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.sqrt(512)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:27.235056800Z",
     "start_time": "2024-08-05T08:06:27.161089200Z"
    },
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 449
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T01:56:08.779261Z",
     "iopub.status.busy": "2025-02-07T01:56:08.778797Z",
     "iopub.status.idle": "2025-02-07T01:56:08.882678Z",
     "shell.execute_reply": "2025-02-07T01:56:08.882057Z",
     "shell.execute_reply.started": "2025-02-07T01:56:08.779229Z"
    },
    "id": "UQPiKK4nN4yG",
    "outputId": "63cfb132-ef75-4f94-f0c8-86a2f36e09c2"
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# NoamDecayScheduler 是一个自定义或外部定义的学习率衰减调度器类。它需要接收配置 config 作为参数，可能实现了特定的学习率衰减方案\n",
    "class NoamDecayScheduler:\n",
    "    def __init__(self, config):\n",
    "        self.d_model = config[\"d_model\"]\n",
    "        self.warmup_steps = config[\"warmup_steps\"]\n",
    "\n",
    "    def __call__(self, step):\n",
    "        step += 1\n",
    "        arg1 = step ** (-0.5) #4000步之后是arg1\n",
    "        arg2 = step * (self.warmup_steps ** (-1.5))  #4000步之前是arg2\n",
    "\n",
    "        arg3 = self.d_model ** (-0.5)\n",
    "\n",
    "        return arg3 * np.minimum(arg1, arg2)\n",
    "\n",
    "\n",
    "temp_learning_rate_schedule = NoamDecayScheduler({\"d_model\": 512, \"warmup_steps\": 4000})\n",
    "#下面是学习率的设计图\n",
    "plt.plot(temp_learning_rate_schedule(np.arange(0, 40000)))\n",
    "plt.ylabel(\"Leraning rate\")\n",
    "plt.xlabel(\"Train step\")\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "XHj_EjzlN4yW"
   },
   "source": [
    "### 优化器"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:27.240054200Z",
     "start_time": "2024-08-05T08:06:27.161089200Z"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T01:56:08.883983Z",
     "iopub.status.busy": "2025-02-07T01:56:08.883486Z",
     "iopub.status.idle": "2025-02-07T01:56:08.888258Z",
     "shell.execute_reply": "2025-02-07T01:56:08.887681Z",
     "shell.execute_reply.started": "2025-02-07T01:56:08.883948Z"
    },
    "id": "1EVLKx2rN4yW"
   },
   "outputs": [],
   "source": [
    "from torch.optim.lr_scheduler import LambdaLR\n",
    "from torch.optim import Adam\n",
    "\n",
    "def get_optimizer(model, config):\n",
    "    base_lr = 0.1\n",
    "    beta1 = config[\"beta1\"] # Adam 的 beta1\n",
    "    beta2 = config[\"beta2\"] # Adam 的 beta2\n",
    "    eps = config[\"eps\"]\n",
    "    optimizer = Adam(model.parameters(), lr=base_lr, betas=(beta1, beta2), eps=eps)\n",
    "    lr_scheduler = NoamDecayScheduler(config) #config是一个字典，包含了学习率衰减的参数\n",
    "    # 使用 LambdaLR 调度器，它可以根据给定的函数 lr_lambda 调整学习率。这里将 lr_scheduler 作为函数传递给 LambdaLR，它包含了特定于模型或任务的学习率调度规则\n",
    "    scheduler = LambdaLR(optimizer, lr_lambda=lr_scheduler)\n",
    "    return optimizer, scheduler"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "JBhiO7O2N4yW"
   },
   "source": [
    "### Callback"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:36.478359Z",
     "start_time": "2024-08-05T08:06:27.161089200Z"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T01:56:08.889474Z",
     "iopub.status.busy": "2025-02-07T01:56:08.888966Z",
     "iopub.status.idle": "2025-02-07T01:56:12.942222Z",
     "shell.execute_reply": "2025-02-07T01:56:12.941683Z",
     "shell.execute_reply.started": "2025-02-07T01:56:08.889452Z"
    },
    "id": "rWFMJwBkN4yX"
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2025-02-07 09:56:09.686903: I tensorflow/core/util/port.cc:153] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`.\n",
      "2025-02-07 09:56:10.059779: E external/local_xla/xla/stream_executor/cuda/cuda_fft.cc:477] Unable to register cuFFT factory: Attempting to register factory for plugin cuFFT when one has already been registered\n",
      "WARNING: All log messages before absl::InitializeLog() is called are written to STDERR\n",
      "E0000 00:00:1738893370.194164     335 cuda_dnn.cc:8310] Unable to register cuDNN factory: Attempting to register factory for plugin cuDNN when one has already been registered\n",
      "E0000 00:00:1738893370.232629     335 cuda_blas.cc:1418] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered\n",
      "2025-02-07 09:56:10.572217: I tensorflow/core/platform/cpu_feature_guard.cc:210] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.\n",
      "To enable the following instructions: AVX2 AVX512F AVX512_VNNI FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.\n"
     ]
    }
   ],
   "source": [
    "from torch.utils.tensorboard import SummaryWriter\n",
    "\n",
    "\n",
    "class TensorBoardCallback:\n",
    "    def __init__(self, log_dir, flush_secs=10):\n",
    "        \"\"\"\n",
    "        Args:\n",
    "            log_dir (str): dir to write log.\n",
    "            flush_secs (int, optional): write to dsk each flush_secs seconds. Defaults to 10.\n",
    "        \"\"\"\n",
    "        self.writer = SummaryWriter(log_dir=log_dir, flush_secs=flush_secs)\n",
    "\n",
    "    def draw_model(self, model, input_shape):\n",
    "        self.writer.add_graph(model, input_to_model=torch.randn(input_shape))\n",
    "\n",
    "    def add_loss_scalars(self, step, loss, val_loss):\n",
    "        self.writer.add_scalars(\n",
    "            main_tag=\"training/loss\",\n",
    "            tag_scalar_dict={\"loss\": loss, \"val_loss\": val_loss},\n",
    "            global_step=step,\n",
    "            )\n",
    "\n",
    "    def add_acc_scalars(self, step, acc, val_acc):\n",
    "        self.writer.add_scalars(\n",
    "            main_tag=\"training/accuracy\",\n",
    "            tag_scalar_dict={\"accuracy\": acc, \"val_accuracy\": val_acc},\n",
    "            global_step=step,\n",
    "        )\n",
    "\n",
    "    def add_lr_scalars(self, step, learning_rate):\n",
    "        self.writer.add_scalars(\n",
    "            main_tag=\"training/learning_rate\",\n",
    "            tag_scalar_dict={\"learning_rate\": learning_rate},\n",
    "            global_step=step,\n",
    "\n",
    "        )\n",
    "\n",
    "    def __call__(self, step, **kwargs):\n",
    "        # add loss\n",
    "        loss = kwargs.pop(\"loss\", None)\n",
    "        val_loss = kwargs.pop(\"val_loss\", None)\n",
    "        if loss is not None and val_loss is not None:\n",
    "            self.add_loss_scalars(step, loss, val_loss)\n",
    "        # add acc\n",
    "        acc = kwargs.pop(\"acc\", None)\n",
    "        val_acc = kwargs.pop(\"val_acc\", None)\n",
    "        if acc is not None and val_acc is not None:\n",
    "            self.add_acc_scalars(step, acc, val_acc)\n",
    "        # add lr\n",
    "        learning_rate = kwargs.pop(\"lr\", None)\n",
    "        if learning_rate is not None:\n",
    "            self.add_lr_scalars(step, learning_rate)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:36.486389200Z",
     "start_time": "2024-08-05T08:06:36.483880700Z"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T01:56:12.943481Z",
     "iopub.status.busy": "2025-02-07T01:56:12.942851Z",
     "iopub.status.idle": "2025-02-07T01:56:12.948402Z",
     "shell.execute_reply": "2025-02-07T01:56:12.947942Z",
     "shell.execute_reply.started": "2025-02-07T01:56:12.943456Z"
    },
    "id": "64y_NBHMN4yX"
   },
   "outputs": [],
   "source": [
    "class SaveCheckpointsCallback:\n",
    "    def __init__(self, save_dir, save_step=5000, save_best_only=True):\n",
    "        \"\"\"\n",
    "        Save checkpoints each save_epoch epoch.\n",
    "        We save checkpoint by epoch in this implementation.\n",
    "        Usually, training scripts with pytorch evaluating model and save checkpoint by step.\n",
    "\n",
    "        Args:\n",
    "            save_dir (str): dir to save checkpoint\n",
    "            save_epoch (int, optional): the frequency to save checkpoint. Defaults to 1.\n",
    "            save_best_only (bool, optional): If True, only save the best model or save each model at every epoch.\n",
    "        \"\"\"\n",
    "        self.save_dir = save_dir\n",
    "        self.save_step = save_step\n",
    "        self.save_best_only = save_best_only\n",
    "        self.best_metrics = - np.inf\n",
    "\n",
    "        # mkdir\n",
    "        if not os.path.exists(self.save_dir):\n",
    "            os.mkdir(self.save_dir)\n",
    "\n",
    "    def __call__(self, step, state_dict, metric=None):\n",
    "        if step % self.save_step > 0:\n",
    "            return\n",
    "\n",
    "        if self.save_best_only:\n",
    "            assert metric is not None\n",
    "            if metric >= self.best_metrics:\n",
    "                # save checkpoints\n",
    "                torch.save(state_dict, os.path.join(self.save_dir, \"best.ckpt\"))\n",
    "                # update best metrics\n",
    "                self.best_metrics = metric\n",
    "        else:\n",
    "            torch.save(state_dict, os.path.join(self.save_dir, f\"{step}.ckpt\"))\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:36.523266500Z",
     "start_time": "2024-08-05T08:06:36.494383100Z"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T01:56:12.949237Z",
     "iopub.status.busy": "2025-02-07T01:56:12.949064Z",
     "iopub.status.idle": "2025-02-07T01:56:12.953542Z",
     "shell.execute_reply": "2025-02-07T01:56:12.953098Z",
     "shell.execute_reply.started": "2025-02-07T01:56:12.949218Z"
    },
    "id": "Uk4PEb70N4yX"
   },
   "outputs": [],
   "source": [
    "class EarlyStopCallback:\n",
    "    def __init__(self, patience=5, min_delta=0.01):\n",
    "        \"\"\"\n",
    "\n",
    "        Args:\n",
    "            patience (int, optional): Number of epochs with no improvement after which training will be stopped.. Defaults to 5.\n",
    "            min_delta (float, optional): Minimum change in the monitored quantity to qualify as an improvement, i.e. an absolute\n",
    "                change of less than min_delta, will count as no improvement. Defaults to 0.01.\n",
    "        \"\"\"\n",
    "        self.patience = patience\n",
    "        self.min_delta = min_delta\n",
    "        self.best_metric = - np.inf\n",
    "        self.counter = 0\n",
    "\n",
    "    def __call__(self, metric):\n",
    "        if metric >= self.best_metric + self.min_delta:\n",
    "            # update best metric\n",
    "            self.best_metric = metric\n",
    "            # reset counter\n",
    "            self.counter = 0\n",
    "        else:\n",
    "            self.counter += 1\n",
    "\n",
    "    @property\n",
    "    def early_stop(self):\n",
    "        return self.counter >= self.patience\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "_AB84Qx1N4yX"
   },
   "source": [
    "### training & valuating"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:36.525265400Z",
     "start_time": "2024-08-05T08:06:36.503642Z"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T01:56:12.954230Z",
     "iopub.status.busy": "2025-02-07T01:56:12.954063Z",
     "iopub.status.idle": "2025-02-07T01:56:12.958323Z",
     "shell.execute_reply": "2025-02-07T01:56:12.957794Z",
     "shell.execute_reply.started": "2025-02-07T01:56:12.954211Z"
    },
    "id": "1mKPSFkON4yX"
   },
   "outputs": [],
   "source": [
    "@torch.no_grad()\n",
    "def evaluating(model, dataloader, loss_fct):\n",
    "    loss_list = []\n",
    "    for batch in dataloader:\n",
    "        encoder_inputs = batch[\"encoder_inputs\"]\n",
    "        encoder_inputs_mask = batch[\"encoder_inputs_mask\"]\n",
    "        decoder_inputs = batch[\"decoder_inputs\"]\n",
    "        decoder_labels = batch[\"decoder_labels\"]\n",
    "        decoder_labels_mask = batch[\"decoder_labels_mask\"]\n",
    "\n",
    "        # 前向计算\n",
    "        outputs = model(\n",
    "            encoder_inputs=encoder_inputs,\n",
    "            decoder_inputs=decoder_inputs,\n",
    "            encoder_inputs_mask=encoder_inputs_mask\n",
    "            )\n",
    "        logits = outputs.logits\n",
    "        loss = loss_fct(logits, decoder_labels, padding_mask=decoder_labels_mask)         # 验证集损失\n",
    "        loss_list.append(loss.cpu().item())\n",
    "\n",
    "    return np.mean(loss_list)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:36.549252Z",
     "start_time": "2024-08-05T08:06:36.514271Z"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T01:56:12.959128Z",
     "iopub.status.busy": "2025-02-07T01:56:12.958904Z",
     "iopub.status.idle": "2025-02-07T01:56:12.967665Z",
     "shell.execute_reply": "2025-02-07T01:56:12.967220Z",
     "shell.execute_reply.started": "2025-02-07T01:56:12.959109Z"
    },
    "id": "PClBmtgWN4yY"
   },
   "outputs": [],
   "source": [
    "# 训练\n",
    "def training(\n",
    "    model,\n",
    "    train_loader,\n",
    "    val_loader,\n",
    "    epoch,\n",
    "    loss_fct,\n",
    "    optimizer,\n",
    "    scheduler=None,\n",
    "    tensorboard_callback=None,\n",
    "    save_ckpt_callback=None,\n",
    "    early_stop_callback=None,\n",
    "    eval_step=500,\n",
    "    ):\n",
    "    record_dict = {\n",
    "        \"train\": [],\n",
    "        \"val\": []\n",
    "    }\n",
    "\n",
    "    global_step = 1\n",
    "    model.train()\n",
    "    with tqdm(total=epoch * len(train_loader)) as pbar:\n",
    "        for epoch_id in range(epoch):\n",
    "            # training\n",
    "            for batch in train_loader:\n",
    "                encoder_inputs = batch[\"encoder_inputs\"]\n",
    "                encoder_inputs_mask = batch[\"encoder_inputs_mask\"]\n",
    "                decoder_inputs = batch[\"decoder_inputs\"]\n",
    "                decoder_labels = batch[\"decoder_labels\"]\n",
    "                decoder_labels_mask = batch[\"decoder_labels_mask\"]\n",
    "                # 梯度清空\n",
    "                optimizer.zero_grad()\n",
    "\n",
    "                # 前向计算\n",
    "                outputs = model(\n",
    "                    encoder_inputs=encoder_inputs,\n",
    "                    decoder_inputs=decoder_inputs,\n",
    "                    encoder_inputs_mask=encoder_inputs_mask\n",
    "                    )\n",
    "                logits = outputs.logits\n",
    "                loss = loss_fct(logits, decoder_labels, padding_mask=decoder_labels_mask)\n",
    "\n",
    "                # 梯度回传\n",
    "                loss.backward()\n",
    "\n",
    "                # 调整优化器，包括学习率的变动等\n",
    "                optimizer.step()\n",
    "                if scheduler is not None:\n",
    "                    scheduler.step() # 更新学习率\n",
    "\n",
    "                loss = loss.cpu().item()\n",
    "                # record\n",
    "                record_dict[\"train\"].append({\n",
    "                    \"loss\": loss, \"step\": global_step\n",
    "                })\n",
    "\n",
    "                # evaluating\n",
    "                if global_step % eval_step == 0:\n",
    "                    model.eval()\n",
    "                    val_loss = evaluating(model, val_loader, loss_fct)\n",
    "                    record_dict[\"val\"].append({\n",
    "                        \"loss\": val_loss, \"step\": global_step\n",
    "                    })\n",
    "                    model.train()\n",
    "\n",
    "                    # 1. 使用 tensorboard 可视化\n",
    "                    cur_lr = optimizer.param_groups[0][\"lr\"] if scheduler is None else scheduler.get_last_lr()[0]\n",
    "                    if tensorboard_callback is not None:\n",
    "                        tensorboard_callback(\n",
    "                            global_step,\n",
    "                            loss=loss, val_loss=val_loss,\n",
    "                            lr=cur_lr,\n",
    "                            )\n",
    "\n",
    "                    # 2. 保存模型权重 save model checkpoint\n",
    "                    if save_ckpt_callback is not None:\n",
    "                        save_ckpt_callback(global_step, model.state_dict(), metric=-val_loss)\n",
    "\n",
    "                    # 3. 早停 Early Stop\n",
    "                    if early_stop_callback is not None:\n",
    "                        early_stop_callback(-val_loss)\n",
    "                        if early_stop_callback.early_stop:\n",
    "                            print(f\"Early stop at epoch {epoch_id} / global_step {global_step}\")\n",
    "                            return record_dict\n",
    "\n",
    "                # udate step\n",
    "                global_step += 1\n",
    "                pbar.update(1)\n",
    "            pbar.set_postfix({\"epoch\": epoch_id, \"loss\": loss, \"val_loss\": val_loss})\n",
    "\n",
    "    return record_dict\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:06:36.628920Z",
     "start_time": "2024-08-05T08:06:36.541257800Z"
    },
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T01:56:12.968492Z",
     "iopub.status.busy": "2025-02-07T01:56:12.968292Z",
     "iopub.status.idle": "2025-02-07T01:56:13.241286Z",
     "shell.execute_reply": "2025-02-07T01:56:13.240767Z",
     "shell.execute_reply.started": "2025-02-07T01:56:12.968472Z"
    },
    "id": "khZqMS8pN4yY",
    "outputId": "2367a363-585b-4321-f7ea-cb11d9623008"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "load train dataset from wmt16/.cache/de2en_train_128.npy\n",
      "load val dataset from wmt16/.cache/de2en_val_128.npy\n"
     ]
    }
   ],
   "source": [
    "#模型的超参\n",
    "config = {\n",
    "    \"bos_idx\": 1,\n",
    "    \"eos_idx\": 3,\n",
    "    \"pad_idx\": 0,\n",
    "    \"vocab_size\": len(word2idx),\n",
    "    \"max_length\": 128,\n",
    "    \"d_model\": 512,\n",
    "    \"dim_feedforward\": 2048, # FFN 的隐藏层大小\n",
    "    \"dropout\": 0.1,\n",
    "    \"layer_norm_eps\": 1e-6, # 层归一化的 epsilon, 防止除零错误\n",
    "    \"num_heads\": 8,\n",
    "    \"num_decoder_layers\": 6,\n",
    "    \"num_encoder_layers\": 6,\n",
    "    \"label_smoothing\": 0.1,\n",
    "    \"beta1\": 0.9, # Adam 的 beta1\n",
    "    \"beta2\": 0.98,\n",
    "    \"eps\": 1e-9,\n",
    "    \"warmup_steps\": 4_000,\n",
    "    \"share_embedding\": False, # 是否共享词向量\n",
    "    }\n",
    "\n",
    "\n",
    "def get_dl(dataset, batch_size, shuffle=True):\n",
    "    sampler = TransformerBatchSampler(dataset, batch_size=batch_size, shuffle_batch=shuffle)\n",
    "    sample_dl = DataLoader(dataset, batch_sampler=sampler, collate_fn=partial(collate_fct, tokenizer=tokenizer))\n",
    "    return sample_dl\n",
    "\n",
    "# dataset\n",
    "train_ds = LangPairDataset(\"train\", max_length=config[\"max_length\"])\n",
    "val_ds = LangPairDataset(\"val\", max_length=config[\"max_length\"])\n",
    "# tokenizer\n",
    "tokenizer = Tokenizer(word2idx=word2idx, idx2word=idx2word, max_length=config[\"max_length\"])\n",
    "batch_size = 2048\n",
    "# dataloader\n",
    "train_dl = get_dl(train_ds, batch_size=batch_size, shuffle=True)\n",
    "val_dl = get_dl(val_ds, batch_size=batch_size, shuffle=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T08:52:53.233851300Z",
     "start_time": "2024-08-05T08:52:51.458743700Z"
    },
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2025-02-07T01:56:13.242273Z",
     "iopub.status.busy": "2025-02-07T01:56:13.241883Z",
     "iopub.status.idle": "2025-02-07T01:56:14.200909Z",
     "shell.execute_reply": "2025-02-07T01:56:14.200142Z",
     "shell.execute_reply.started": "2025-02-07T01:56:13.242252Z"
    },
    "jupyter": {
     "outputs_hidden": false
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "模型参数量: 71938239\n"
     ]
    }
   ],
   "source": [
    "#计算模型参数量\n",
    "model = TransformerModel(config)\n",
    "print(f\"模型参数量: {sum(p.numel() for p in model.parameters() if p.requires_grad)}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-07T08:52:38.372364400Z",
     "start_time": "2024-05-07T08:52:38.191467100Z"
    },
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T01:56:14.202260Z",
     "iopub.status.busy": "2025-02-07T01:56:14.201709Z",
     "iopub.status.idle": "2025-02-07T01:56:14.206872Z",
     "shell.execute_reply": "2025-02-07T01:56:14.206216Z",
     "shell.execute_reply.started": "2025-02-07T01:56:14.202225Z"
    },
    "id": "63slV04gWLn8",
    "outputId": "5c5ede03-0f6f-48d5-a177-d961886ec340"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'bos_idx': 1,\n",
       " 'eos_idx': 3,\n",
       " 'pad_idx': 0,\n",
       " 'vocab_size': 18111,\n",
       " 'max_length': 128,\n",
       " 'd_model': 512,\n",
       " 'dim_feedforward': 2048,\n",
       " 'dropout': 0.1,\n",
       " 'layer_norm_eps': 1e-06,\n",
       " 'num_heads': 8,\n",
       " 'num_decoder_layers': 6,\n",
       " 'num_encoder_layers': 6,\n",
       " 'label_smoothing': 0.1,\n",
       " 'beta1': 0.9,\n",
       " 'beta2': 0.98,\n",
       " 'eps': 1e-09,\n",
       " 'warmup_steps': 4000,\n",
       " 'share_embedding': False}"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "config"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {
    "ExecutionIndicator": {
     "show": true
    },
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 49,
     "referenced_widgets": [
      "55146ac7395840dca847e0f63aa80561",
      "abb9bc76c0ce4634bd340be20c074b8c",
      "a89d790df59245fcaf26335d4903c9b4",
      "f837255914194dc792cf1514dee03dc5",
      "46a51a1719d8444eb5877720253d3c37",
      "013d2a6b90144432bbfb15136235faba",
      "2b82e42c34804b13bc83be4c7009d4e2",
      "9233439bdd6746c28ad4a20ef47799f6",
      "0e10428326bc436e8dbc079e89570bde",
      "0fe4ed7283c04496affe727c235d31c4",
      "0c0c7229347b49ffbb9a0f7bd41199b9"
     ]
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T02:49:20.446054Z",
     "iopub.status.busy": "2025-02-07T02:49:20.445690Z",
     "iopub.status.idle": "2025-02-07T02:49:21.434498Z",
     "shell.execute_reply": "2025-02-07T02:49:21.433963Z",
     "shell.execute_reply.started": "2025-02-07T02:49:20.446030Z"
    },
    "id": "tVO2zJ04N4yY",
    "outputId": "7d4079f5-65d4-4da1-9001-91aa5525250e",
    "tags": []
   },
   "outputs": [],
   "source": [
    "epoch = 100\n",
    "\n",
    "# model\n",
    "model = TransformerModel(config)\n",
    "# 1. 定义损失函数 采用交叉熵损失\n",
    "loss_fct = CrossEntropyWithPadding(config)\n",
    "# 2. 定义优化器 采用 adam\n",
    "# Optimizers specified in the torch.optim package\n",
    "optimizer, scheduler = get_optimizer(model, config)\n",
    "\n",
    "# 1. tensorboard 可视化\n",
    "if not os.path.exists(\"runs\"):\n",
    "    os.mkdir(\"runs\")\n",
    "exp_name = \"translate-transformer-{}\".format(\"share\" if config[\"share_embedding\"] else \"not-share\")\n",
    "tensorboard_callback = TensorBoardCallback(f\"runs/{exp_name}\")\n",
    "# tensorboard_callback.draw_model(model, [1, MAX_LENGTH])\n",
    "# 2. save best\n",
    "if not os.path.exists(\"checkpoints\"):\n",
    "    os.makedirs(\"checkpoints\")\n",
    "save_ckpt_callback = SaveCheckpointsCallback(\n",
    "    f\"checkpoints/{exp_name}\", save_step=500, save_best_only=True)\n",
    "# 3. early stop\n",
    "early_stop_callback = EarlyStopCallback(patience=10,min_delta=0.001)\n",
    "\n",
    "model = model.to(device)\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "# We trained the base models for a total of 100,000 steps or 12 hours. For our big models,(described on the bottom line of table 3), step time was 1.0 seconds. The big models were trained for 300,000 steps (3.5 days)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {
    "ExecutionIndicator": {
     "show": true
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T02:49:24.167950Z",
     "iopub.status.busy": "2025-02-07T02:49:24.167589Z",
     "iopub.status.idle": "2025-02-07T03:13:38.444228Z",
     "shell.execute_reply": "2025-02-07T03:13:38.443708Z",
     "shell.execute_reply.started": "2025-02-07T02:49:24.167924Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 35%|███▍      | 36499/105100 [24:14<45:33, 25.10it/s, epoch=33, loss=2.73, val_loss=3.45]  "
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Early stop at epoch 34 / global_step 36500\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "record = training(\n",
    "    model,\n",
    "    train_dl,\n",
    "    val_dl,\n",
    "    epoch,\n",
    "    loss_fct,\n",
    "    optimizer,\n",
    "    scheduler,\n",
    "    tensorboard_callback=tensorboard_callback,\n",
    "    save_ckpt_callback=save_ckpt_callback,\n",
    "    early_stop_callback=early_stop_callback,\n",
    "    eval_step=500\n",
    "    )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-02-07T06:02:51.186708Z",
     "iopub.status.busy": "2025-02-07T06:02:51.186355Z",
     "iopub.status.idle": "2025-02-07T06:02:51.239182Z",
     "shell.execute_reply": "2025-02-07T06:02:51.238695Z",
     "shell.execute_reply.started": "2025-02-07T06:02:51.186685Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'train': [{'loss': 9.813298225402832, 'step': 1},\n",
       "  {'loss': 9.846790313720703, 'step': 2},\n",
       "  {'loss': 9.80693244934082, 'step': 3},\n",
       "  {'loss': 9.837906837463379, 'step': 4},\n",
       "  {'loss': 9.805830955505371, 'step': 5},\n",
       "  {'loss': 9.815483093261719, 'step': 6},\n",
       "  {'loss': 9.829819679260254, 'step': 7},\n",
       "  {'loss': 9.847330093383789, 'step': 8},\n",
       "  {'loss': 9.831949234008789, 'step': 9},\n",
       "  {'loss': 9.815035820007324, 'step': 10},\n",
       "  {'loss': 9.805778503417969, 'step': 11},\n",
       "  {'loss': 9.831337928771973, 'step': 12},\n",
       "  {'loss': 9.804222106933594, 'step': 13},\n",
       "  {'loss': 9.828509330749512, 'step': 14},\n",
       "  {'loss': 9.836542129516602, 'step': 15},\n",
       "  {'loss': 9.788138389587402, 'step': 16},\n",
       "  {'loss': 9.811850547790527, 'step': 17},\n",
       "  {'loss': 9.802845001220703, 'step': 18},\n",
       "  {'loss': 9.79996395111084, 'step': 19},\n",
       "  {'loss': 9.804767608642578, 'step': 20},\n",
       "  {'loss': 9.783594131469727, 'step': 21},\n",
       "  {'loss': 9.774408340454102, 'step': 22},\n",
       "  {'loss': 9.805024147033691, 'step': 23},\n",
       "  {'loss': 9.779841423034668, 'step': 24},\n",
       "  {'loss': 9.783570289611816, 'step': 25},\n",
       "  {'loss': 9.750850677490234, 'step': 26},\n",
       "  {'loss': 9.755263328552246, 'step': 27},\n",
       "  {'loss': 9.793989181518555, 'step': 28},\n",
       "  {'loss': 9.76324462890625, 'step': 29},\n",
       "  {'loss': 9.759079933166504, 'step': 30},\n",
       "  {'loss': 9.737630844116211, 'step': 31},\n",
       "  {'loss': 9.758098602294922, 'step': 32},\n",
       "  {'loss': 9.767976760864258, 'step': 33},\n",
       "  {'loss': 9.735939025878906, 'step': 34},\n",
       "  {'loss': 9.751228332519531, 'step': 35},\n",
       "  {'loss': 9.73042106628418, 'step': 36},\n",
       "  {'loss': 9.775464057922363, 'step': 37},\n",
       "  {'loss': 9.724288940429688, 'step': 38},\n",
       "  {'loss': 9.735692977905273, 'step': 39},\n",
       "  {'loss': 9.747160911560059, 'step': 40},\n",
       "  {'loss': 9.7296724319458, 'step': 41},\n",
       "  {'loss': 9.717476844787598, 'step': 42},\n",
       "  {'loss': 9.704133033752441, 'step': 43},\n",
       "  {'loss': 9.685352325439453, 'step': 44},\n",
       "  {'loss': 9.702113151550293, 'step': 45},\n",
       "  {'loss': 9.6748628616333, 'step': 46},\n",
       "  {'loss': 9.697487831115723, 'step': 47},\n",
       "  {'loss': 9.684391975402832, 'step': 48},\n",
       "  {'loss': 9.664401054382324, 'step': 49},\n",
       "  {'loss': 9.678911209106445, 'step': 50},\n",
       "  {'loss': 9.631369590759277, 'step': 51},\n",
       "  {'loss': 9.667637825012207, 'step': 52},\n",
       "  {'loss': 9.682175636291504, 'step': 53},\n",
       "  {'loss': 9.652381896972656, 'step': 54},\n",
       "  {'loss': 9.653122901916504, 'step': 55},\n",
       "  {'loss': 9.620031356811523, 'step': 56},\n",
       "  {'loss': 9.616650581359863, 'step': 57},\n",
       "  {'loss': 9.69540786743164, 'step': 58},\n",
       "  {'loss': 9.608072280883789, 'step': 59},\n",
       "  {'loss': 9.687943458557129, 'step': 60},\n",
       "  {'loss': 9.653789520263672, 'step': 61},\n",
       "  {'loss': 9.606343269348145, 'step': 62},\n",
       "  {'loss': 9.607882499694824, 'step': 63},\n",
       "  {'loss': 9.607304573059082, 'step': 64},\n",
       "  {'loss': 9.629454612731934, 'step': 65},\n",
       "  {'loss': 9.566946029663086, 'step': 66},\n",
       "  {'loss': 9.504725456237793, 'step': 67},\n",
       "  {'loss': 9.533309936523438, 'step': 68},\n",
       "  {'loss': 9.548696517944336, 'step': 69},\n",
       "  {'loss': 9.51410961151123, 'step': 70},\n",
       "  {'loss': 9.525331497192383, 'step': 71},\n",
       "  {'loss': 9.488323211669922, 'step': 72},\n",
       "  {'loss': 9.488691329956055, 'step': 73},\n",
       "  {'loss': 9.53537654876709, 'step': 74},\n",
       "  {'loss': 9.456440925598145, 'step': 75},\n",
       "  {'loss': 9.476346969604492, 'step': 76},\n",
       "  {'loss': 9.535514831542969, 'step': 77},\n",
       "  {'loss': 9.451395988464355, 'step': 78},\n",
       "  {'loss': 9.558493614196777, 'step': 79},\n",
       "  {'loss': 9.538569450378418, 'step': 80},\n",
       "  {'loss': 9.458621978759766, 'step': 81},\n",
       "  {'loss': 9.47622013092041, 'step': 82},\n",
       "  {'loss': 9.460701942443848, 'step': 83},\n",
       "  {'loss': 9.485766410827637, 'step': 84},\n",
       "  {'loss': 9.370020866394043, 'step': 85},\n",
       "  {'loss': 9.391406059265137, 'step': 86},\n",
       "  {'loss': 9.507101058959961, 'step': 87},\n",
       "  {'loss': 9.494454383850098, 'step': 88},\n",
       "  {'loss': 9.542218208312988, 'step': 89},\n",
       "  {'loss': 9.479737281799316, 'step': 90},\n",
       "  {'loss': 9.419239044189453, 'step': 91},\n",
       "  {'loss': 9.384112358093262, 'step': 92},\n",
       "  {'loss': 9.31325912475586, 'step': 93},\n",
       "  {'loss': 9.4627046585083, 'step': 94},\n",
       "  {'loss': 9.421420097351074, 'step': 95},\n",
       "  {'loss': 9.371665954589844, 'step': 96},\n",
       "  {'loss': 9.317673683166504, 'step': 97},\n",
       "  {'loss': 9.355690956115723, 'step': 98},\n",
       "  {'loss': 9.35610580444336, 'step': 99},\n",
       "  {'loss': 9.390294075012207, 'step': 100},\n",
       "  {'loss': 9.297452926635742, 'step': 101},\n",
       "  {'loss': 9.384299278259277, 'step': 102},\n",
       "  {'loss': 9.32016372680664, 'step': 103},\n",
       "  {'loss': 9.26982307434082, 'step': 104},\n",
       "  {'loss': 9.401479721069336, 'step': 105},\n",
       "  {'loss': 9.326569557189941, 'step': 106},\n",
       "  {'loss': 9.30661678314209, 'step': 107},\n",
       "  {'loss': 9.425943374633789, 'step': 108},\n",
       "  {'loss': 9.226667404174805, 'step': 109},\n",
       "  {'loss': 9.307618141174316, 'step': 110},\n",
       "  {'loss': 9.36096477508545, 'step': 111},\n",
       "  {'loss': 9.258698463439941, 'step': 112},\n",
       "  {'loss': 9.214056968688965, 'step': 113},\n",
       "  {'loss': 9.395184516906738, 'step': 114},\n",
       "  {'loss': 9.332368850708008, 'step': 115},\n",
       "  {'loss': 9.319520950317383, 'step': 116},\n",
       "  {'loss': 9.230656623840332, 'step': 117},\n",
       "  {'loss': 9.151555061340332, 'step': 118},\n",
       "  {'loss': 9.371703147888184, 'step': 119},\n",
       "  {'loss': 9.334643363952637, 'step': 120},\n",
       "  {'loss': 9.198238372802734, 'step': 121},\n",
       "  {'loss': 9.251315116882324, 'step': 122},\n",
       "  {'loss': 9.261496543884277, 'step': 123},\n",
       "  {'loss': 9.203520774841309, 'step': 124},\n",
       "  {'loss': 9.266937255859375, 'step': 125},\n",
       "  {'loss': 9.348097801208496, 'step': 126},\n",
       "  {'loss': 9.110244750976562, 'step': 127},\n",
       "  {'loss': 9.16830062866211, 'step': 128},\n",
       "  {'loss': 9.136307716369629, 'step': 129},\n",
       "  {'loss': 9.139228820800781, 'step': 130},\n",
       "  {'loss': 9.255719184875488, 'step': 131},\n",
       "  {'loss': 9.262752532958984, 'step': 132},\n",
       "  {'loss': 9.234654426574707, 'step': 133},\n",
       "  {'loss': 9.253469467163086, 'step': 134},\n",
       "  {'loss': 9.0347900390625, 'step': 135},\n",
       "  {'loss': 9.077967643737793, 'step': 136},\n",
       "  {'loss': 9.246343612670898, 'step': 137},\n",
       "  {'loss': 9.151588439941406, 'step': 138},\n",
       "  {'loss': 9.081583023071289, 'step': 139},\n",
       "  {'loss': 9.185919761657715, 'step': 140},\n",
       "  {'loss': 9.1660795211792, 'step': 141},\n",
       "  {'loss': 9.179585456848145, 'step': 142},\n",
       "  {'loss': 9.175172805786133, 'step': 143},\n",
       "  {'loss': 9.236414909362793, 'step': 144},\n",
       "  {'loss': 9.068989753723145, 'step': 145},\n",
       "  {'loss': 9.329622268676758, 'step': 146},\n",
       "  {'loss': 9.174052238464355, 'step': 147},\n",
       "  {'loss': 9.244436264038086, 'step': 148},\n",
       "  {'loss': 9.182446479797363, 'step': 149},\n",
       "  {'loss': 9.142840385437012, 'step': 150},\n",
       "  {'loss': 9.092390060424805, 'step': 151},\n",
       "  {'loss': 9.234553337097168, 'step': 152},\n",
       "  {'loss': 9.067996978759766, 'step': 153},\n",
       "  {'loss': 9.031980514526367, 'step': 154},\n",
       "  {'loss': 9.060093879699707, 'step': 155},\n",
       "  {'loss': 8.932888984680176, 'step': 156},\n",
       "  {'loss': 9.153532028198242, 'step': 157},\n",
       "  {'loss': 9.05926513671875, 'step': 158},\n",
       "  {'loss': 9.224553108215332, 'step': 159},\n",
       "  {'loss': 9.18912124633789, 'step': 160},\n",
       "  {'loss': 9.167593002319336, 'step': 161},\n",
       "  {'loss': 9.214043617248535, 'step': 162},\n",
       "  {'loss': 9.150691986083984, 'step': 163},\n",
       "  {'loss': 8.969974517822266, 'step': 164},\n",
       "  {'loss': 8.97407054901123, 'step': 165},\n",
       "  {'loss': 9.121438026428223, 'step': 166},\n",
       "  {'loss': 9.108227729797363, 'step': 167},\n",
       "  {'loss': 9.10708999633789, 'step': 168},\n",
       "  {'loss': 9.225590705871582, 'step': 169},\n",
       "  {'loss': 8.962899208068848, 'step': 170},\n",
       "  {'loss': 9.16063404083252, 'step': 171},\n",
       "  {'loss': 9.104692459106445, 'step': 172},\n",
       "  {'loss': 8.957292556762695, 'step': 173},\n",
       "  {'loss': 9.072291374206543, 'step': 174},\n",
       "  {'loss': 9.111528396606445, 'step': 175},\n",
       "  {'loss': 9.080506324768066, 'step': 176},\n",
       "  {'loss': 9.047221183776855, 'step': 177},\n",
       "  {'loss': 9.202398300170898, 'step': 178},\n",
       "  {'loss': 9.161787033081055, 'step': 179},\n",
       "  {'loss': 8.97637939453125, 'step': 180},\n",
       "  {'loss': 8.938814163208008, 'step': 181},\n",
       "  {'loss': 9.11227035522461, 'step': 182},\n",
       "  {'loss': 8.939773559570312, 'step': 183},\n",
       "  {'loss': 8.869439125061035, 'step': 184},\n",
       "  {'loss': 8.948938369750977, 'step': 185},\n",
       "  {'loss': 9.171072959899902, 'step': 186},\n",
       "  {'loss': 9.07176685333252, 'step': 187},\n",
       "  {'loss': 9.062028884887695, 'step': 188},\n",
       "  {'loss': 9.20743465423584, 'step': 189},\n",
       "  {'loss': 8.990849494934082, 'step': 190},\n",
       "  {'loss': 8.984764099121094, 'step': 191},\n",
       "  {'loss': 8.885552406311035, 'step': 192},\n",
       "  {'loss': 9.052433013916016, 'step': 193},\n",
       "  {'loss': 9.023622512817383, 'step': 194},\n",
       "  {'loss': 9.021456718444824, 'step': 195},\n",
       "  {'loss': 8.991665840148926, 'step': 196},\n",
       "  {'loss': 8.991002082824707, 'step': 197},\n",
       "  {'loss': 8.877195358276367, 'step': 198},\n",
       "  {'loss': 8.972742080688477, 'step': 199},\n",
       "  {'loss': 8.953932762145996, 'step': 200},\n",
       "  {'loss': 8.963726043701172, 'step': 201},\n",
       "  {'loss': 8.861419677734375, 'step': 202},\n",
       "  {'loss': 9.18039608001709, 'step': 203},\n",
       "  {'loss': 9.041153907775879, 'step': 204},\n",
       "  {'loss': 9.041091918945312, 'step': 205},\n",
       "  {'loss': 9.03514575958252, 'step': 206},\n",
       "  {'loss': 8.900933265686035, 'step': 207},\n",
       "  {'loss': 9.063471794128418, 'step': 208},\n",
       "  {'loss': 9.044939994812012, 'step': 209},\n",
       "  {'loss': 8.946651458740234, 'step': 210},\n",
       "  {'loss': 8.838788032531738, 'step': 211},\n",
       "  {'loss': 8.784708976745605, 'step': 212},\n",
       "  {'loss': 9.053291320800781, 'step': 213},\n",
       "  {'loss': 8.994462013244629, 'step': 214},\n",
       "  {'loss': 8.946216583251953, 'step': 215},\n",
       "  {'loss': 8.91368293762207, 'step': 216},\n",
       "  {'loss': 9.010361671447754, 'step': 217},\n",
       "  {'loss': 8.808658599853516, 'step': 218},\n",
       "  {'loss': 8.966407775878906, 'step': 219},\n",
       "  {'loss': 8.839692115783691, 'step': 220},\n",
       "  {'loss': 8.839009284973145, 'step': 221},\n",
       "  {'loss': 9.01939582824707, 'step': 222},\n",
       "  {'loss': 9.015803337097168, 'step': 223},\n",
       "  {'loss': 8.715110778808594, 'step': 224},\n",
       "  {'loss': 8.788336753845215, 'step': 225},\n",
       "  {'loss': 8.860254287719727, 'step': 226},\n",
       "  {'loss': 9.005743980407715, 'step': 227},\n",
       "  {'loss': 9.028616905212402, 'step': 228},\n",
       "  {'loss': 8.880093574523926, 'step': 229},\n",
       "  {'loss': 9.021961212158203, 'step': 230},\n",
       "  {'loss': 8.651981353759766, 'step': 231},\n",
       "  {'loss': 8.929232597351074, 'step': 232},\n",
       "  {'loss': 8.976031303405762, 'step': 233},\n",
       "  {'loss': 8.808722496032715, 'step': 234},\n",
       "  {'loss': 8.832366943359375, 'step': 235},\n",
       "  {'loss': 8.921568870544434, 'step': 236},\n",
       "  {'loss': 8.996048927307129, 'step': 237},\n",
       "  {'loss': 8.831059455871582, 'step': 238},\n",
       "  {'loss': 8.982064247131348, 'step': 239},\n",
       "  {'loss': 8.781103134155273, 'step': 240},\n",
       "  {'loss': 8.792298316955566, 'step': 241},\n",
       "  {'loss': 9.066349029541016, 'step': 242},\n",
       "  {'loss': 8.89188289642334, 'step': 243},\n",
       "  {'loss': 8.88785171508789, 'step': 244},\n",
       "  {'loss': 8.916605949401855, 'step': 245},\n",
       "  {'loss': 8.950520515441895, 'step': 246},\n",
       "  {'loss': 8.886033058166504, 'step': 247},\n",
       "  {'loss': 9.014211654663086, 'step': 248},\n",
       "  {'loss': 8.707903861999512, 'step': 249},\n",
       "  {'loss': 8.932785987854004, 'step': 250},\n",
       "  {'loss': 8.768165588378906, 'step': 251},\n",
       "  {'loss': 8.75196361541748, 'step': 252},\n",
       "  {'loss': 8.8831787109375, 'step': 253},\n",
       "  {'loss': 8.763893127441406, 'step': 254},\n",
       "  {'loss': 8.850852012634277, 'step': 255},\n",
       "  {'loss': 8.796339988708496, 'step': 256},\n",
       "  {'loss': 8.785299301147461, 'step': 257},\n",
       "  {'loss': 8.905158996582031, 'step': 258},\n",
       "  {'loss': 8.822150230407715, 'step': 259},\n",
       "  {'loss': 8.911623001098633, 'step': 260},\n",
       "  {'loss': 8.7716646194458, 'step': 261},\n",
       "  {'loss': 8.707110404968262, 'step': 262},\n",
       "  {'loss': 8.750627517700195, 'step': 263},\n",
       "  {'loss': 8.963709831237793, 'step': 264},\n",
       "  {'loss': 8.85325813293457, 'step': 265},\n",
       "  {'loss': 8.923229217529297, 'step': 266},\n",
       "  {'loss': 8.821447372436523, 'step': 267},\n",
       "  {'loss': 8.695228576660156, 'step': 268},\n",
       "  {'loss': 8.940834999084473, 'step': 269},\n",
       "  {'loss': 8.981943130493164, 'step': 270},\n",
       "  {'loss': 8.871824264526367, 'step': 271},\n",
       "  {'loss': 8.781439781188965, 'step': 272},\n",
       "  {'loss': 8.800148963928223, 'step': 273},\n",
       "  {'loss': 8.876420974731445, 'step': 274},\n",
       "  {'loss': 8.872306823730469, 'step': 275},\n",
       "  {'loss': 8.746548652648926, 'step': 276},\n",
       "  {'loss': 8.607351303100586, 'step': 277},\n",
       "  {'loss': 8.842741012573242, 'step': 278},\n",
       "  {'loss': 8.814263343811035, 'step': 279},\n",
       "  {'loss': 8.730738639831543, 'step': 280},\n",
       "  {'loss': 8.76352310180664, 'step': 281},\n",
       "  {'loss': 8.783010482788086, 'step': 282},\n",
       "  {'loss': 8.739629745483398, 'step': 283},\n",
       "  {'loss': 8.862480163574219, 'step': 284},\n",
       "  {'loss': 8.834729194641113, 'step': 285},\n",
       "  {'loss': 8.738127708435059, 'step': 286},\n",
       "  {'loss': 8.53289794921875, 'step': 287},\n",
       "  {'loss': 8.589681625366211, 'step': 288},\n",
       "  {'loss': 8.80439567565918, 'step': 289},\n",
       "  {'loss': 8.56955623626709, 'step': 290},\n",
       "  {'loss': 8.659159660339355, 'step': 291},\n",
       "  {'loss': 8.87216567993164, 'step': 292},\n",
       "  {'loss': 8.852065086364746, 'step': 293},\n",
       "  {'loss': 8.864052772521973, 'step': 294},\n",
       "  {'loss': 8.878767013549805, 'step': 295},\n",
       "  {'loss': 8.728959083557129, 'step': 296},\n",
       "  {'loss': 8.713821411132812, 'step': 297},\n",
       "  {'loss': 8.648340225219727, 'step': 298},\n",
       "  {'loss': 8.763789176940918, 'step': 299},\n",
       "  {'loss': 8.828783988952637, 'step': 300},\n",
       "  {'loss': 8.814336776733398, 'step': 301},\n",
       "  {'loss': 8.641138076782227, 'step': 302},\n",
       "  {'loss': 8.69596004486084, 'step': 303},\n",
       "  {'loss': 8.714531898498535, 'step': 304},\n",
       "  {'loss': 8.534069061279297, 'step': 305},\n",
       "  {'loss': 8.812735557556152, 'step': 306},\n",
       "  {'loss': 8.773838996887207, 'step': 307},\n",
       "  {'loss': 8.615514755249023, 'step': 308},\n",
       "  {'loss': 8.651385307312012, 'step': 309},\n",
       "  {'loss': 8.542707443237305, 'step': 310},\n",
       "  {'loss': 8.608368873596191, 'step': 311},\n",
       "  {'loss': 8.615422248840332, 'step': 312},\n",
       "  {'loss': 8.614117622375488, 'step': 313},\n",
       "  {'loss': 8.673869132995605, 'step': 314},\n",
       "  {'loss': 8.657171249389648, 'step': 315},\n",
       "  {'loss': 8.819626808166504, 'step': 316},\n",
       "  {'loss': 8.672447204589844, 'step': 317},\n",
       "  {'loss': 8.649385452270508, 'step': 318},\n",
       "  {'loss': 8.704434394836426, 'step': 319},\n",
       "  {'loss': 8.624900817871094, 'step': 320},\n",
       "  {'loss': 8.515588760375977, 'step': 321},\n",
       "  {'loss': 8.484025955200195, 'step': 322},\n",
       "  {'loss': 8.492536544799805, 'step': 323},\n",
       "  {'loss': 8.71715259552002, 'step': 324},\n",
       "  {'loss': 8.529121398925781, 'step': 325},\n",
       "  {'loss': 8.58369255065918, 'step': 326},\n",
       "  {'loss': 8.390117645263672, 'step': 327},\n",
       "  {'loss': 8.691899299621582, 'step': 328},\n",
       "  {'loss': 8.7028169631958, 'step': 329},\n",
       "  {'loss': 8.691194534301758, 'step': 330},\n",
       "  {'loss': 8.784505844116211, 'step': 331},\n",
       "  {'loss': 8.47523021697998, 'step': 332},\n",
       "  {'loss': 8.69316291809082, 'step': 333},\n",
       "  {'loss': 8.706575393676758, 'step': 334},\n",
       "  {'loss': 8.71676254272461, 'step': 335},\n",
       "  {'loss': 8.491972923278809, 'step': 336},\n",
       "  {'loss': 8.439501762390137, 'step': 337},\n",
       "  {'loss': 8.668197631835938, 'step': 338},\n",
       "  {'loss': 8.542356491088867, 'step': 339},\n",
       "  {'loss': 8.33072566986084, 'step': 340},\n",
       "  {'loss': 8.461228370666504, 'step': 341},\n",
       "  {'loss': 8.64993667602539, 'step': 342},\n",
       "  {'loss': 8.702380180358887, 'step': 343},\n",
       "  {'loss': 8.386880874633789, 'step': 344},\n",
       "  {'loss': 8.408082008361816, 'step': 345},\n",
       "  {'loss': 8.685554504394531, 'step': 346},\n",
       "  {'loss': 8.395565032958984, 'step': 347},\n",
       "  {'loss': 8.766148567199707, 'step': 348},\n",
       "  {'loss': 8.307760238647461, 'step': 349},\n",
       "  {'loss': 8.592992782592773, 'step': 350},\n",
       "  {'loss': 8.470973014831543, 'step': 351},\n",
       "  {'loss': 8.545461654663086, 'step': 352},\n",
       "  {'loss': 8.768662452697754, 'step': 353},\n",
       "  {'loss': 8.668107032775879, 'step': 354},\n",
       "  {'loss': 8.558161735534668, 'step': 355},\n",
       "  {'loss': 8.494169235229492, 'step': 356},\n",
       "  {'loss': 8.315774917602539, 'step': 357},\n",
       "  {'loss': 8.507614135742188, 'step': 358},\n",
       "  {'loss': 8.46921157836914, 'step': 359},\n",
       "  {'loss': 8.490914344787598, 'step': 360},\n",
       "  {'loss': 8.40661334991455, 'step': 361},\n",
       "  {'loss': 8.417440414428711, 'step': 362},\n",
       "  {'loss': 8.45458698272705, 'step': 363},\n",
       "  {'loss': 8.425622940063477, 'step': 364},\n",
       "  {'loss': 8.354659080505371, 'step': 365},\n",
       "  {'loss': 8.509692192077637, 'step': 366},\n",
       "  {'loss': 8.44338321685791, 'step': 367},\n",
       "  {'loss': 8.5762300491333, 'step': 368},\n",
       "  {'loss': 8.5166015625, 'step': 369},\n",
       "  {'loss': 8.504181861877441, 'step': 370},\n",
       "  {'loss': 8.471541404724121, 'step': 371},\n",
       "  {'loss': 8.671394348144531, 'step': 372},\n",
       "  {'loss': 8.409905433654785, 'step': 373},\n",
       "  {'loss': 8.5715913772583, 'step': 374},\n",
       "  {'loss': 8.507619857788086, 'step': 375},\n",
       "  {'loss': 8.36286735534668, 'step': 376},\n",
       "  {'loss': 8.266242980957031, 'step': 377},\n",
       "  {'loss': 8.455770492553711, 'step': 378},\n",
       "  {'loss': 8.225919723510742, 'step': 379},\n",
       "  {'loss': 8.482051849365234, 'step': 380},\n",
       "  {'loss': 8.190463066101074, 'step': 381},\n",
       "  {'loss': 8.47919750213623, 'step': 382},\n",
       "  {'loss': 8.521740913391113, 'step': 383},\n",
       "  {'loss': 8.38235092163086, 'step': 384},\n",
       "  {'loss': 8.461644172668457, 'step': 385},\n",
       "  {'loss': 8.28978157043457, 'step': 386},\n",
       "  {'loss': 8.349817276000977, 'step': 387},\n",
       "  {'loss': 8.474125862121582, 'step': 388},\n",
       "  {'loss': 8.51682186126709, 'step': 389},\n",
       "  {'loss': 8.200081825256348, 'step': 390},\n",
       "  {'loss': 8.451717376708984, 'step': 391},\n",
       "  {'loss': 8.17066764831543, 'step': 392},\n",
       "  {'loss': 8.549347877502441, 'step': 393},\n",
       "  {'loss': 8.335010528564453, 'step': 394},\n",
       "  {'loss': 8.219706535339355, 'step': 395},\n",
       "  {'loss': 8.066903114318848, 'step': 396},\n",
       "  {'loss': 8.04537582397461, 'step': 397},\n",
       "  {'loss': 8.203794479370117, 'step': 398},\n",
       "  {'loss': 8.57514762878418, 'step': 399},\n",
       "  {'loss': 8.284622192382812, 'step': 400},\n",
       "  {'loss': 8.377142906188965, 'step': 401},\n",
       "  {'loss': 8.478285789489746, 'step': 402},\n",
       "  {'loss': 8.420802116394043, 'step': 403},\n",
       "  {'loss': 8.135154724121094, 'step': 404},\n",
       "  {'loss': 8.578624725341797, 'step': 405},\n",
       "  {'loss': 8.407008171081543, 'step': 406},\n",
       "  {'loss': 8.157690048217773, 'step': 407},\n",
       "  {'loss': 8.336507797241211, 'step': 408},\n",
       "  {'loss': 8.282269477844238, 'step': 409},\n",
       "  {'loss': 8.21560001373291, 'step': 410},\n",
       "  {'loss': 8.30517864227295, 'step': 411},\n",
       "  {'loss': 8.450770378112793, 'step': 412},\n",
       "  {'loss': 8.285723686218262, 'step': 413},\n",
       "  {'loss': 8.24640941619873, 'step': 414},\n",
       "  {'loss': 8.21612548828125, 'step': 415},\n",
       "  {'loss': 8.219548225402832, 'step': 416},\n",
       "  {'loss': 8.067683219909668, 'step': 417},\n",
       "  {'loss': 7.980568885803223, 'step': 418},\n",
       "  {'loss': 8.215616226196289, 'step': 419},\n",
       "  {'loss': 8.28122329711914, 'step': 420},\n",
       "  {'loss': 8.315113067626953, 'step': 421},\n",
       "  {'loss': 8.249500274658203, 'step': 422},\n",
       "  {'loss': 8.186978340148926, 'step': 423},\n",
       "  {'loss': 8.1402587890625, 'step': 424},\n",
       "  {'loss': 8.004653930664062, 'step': 425},\n",
       "  {'loss': 8.269366264343262, 'step': 426},\n",
       "  {'loss': 8.239714622497559, 'step': 427},\n",
       "  {'loss': 7.839775562286377, 'step': 428},\n",
       "  {'loss': 8.409459114074707, 'step': 429},\n",
       "  {'loss': 7.98799467086792, 'step': 430},\n",
       "  {'loss': 8.453096389770508, 'step': 431},\n",
       "  {'loss': 8.272172927856445, 'step': 432},\n",
       "  {'loss': 8.134786605834961, 'step': 433},\n",
       "  {'loss': 8.30467700958252, 'step': 434},\n",
       "  {'loss': 8.032502174377441, 'step': 435},\n",
       "  {'loss': 8.198199272155762, 'step': 436},\n",
       "  {'loss': 8.432165145874023, 'step': 437},\n",
       "  {'loss': 8.138957023620605, 'step': 438},\n",
       "  {'loss': 8.22103214263916, 'step': 439},\n",
       "  {'loss': 8.342105865478516, 'step': 440},\n",
       "  {'loss': 8.07496166229248, 'step': 441},\n",
       "  {'loss': 8.261636734008789, 'step': 442},\n",
       "  {'loss': 8.41708755493164, 'step': 443},\n",
       "  {'loss': 7.95464563369751, 'step': 444},\n",
       "  {'loss': 7.957870006561279, 'step': 445},\n",
       "  {'loss': 8.24764633178711, 'step': 446},\n",
       "  {'loss': 8.175873756408691, 'step': 447},\n",
       "  {'loss': 7.8461079597473145, 'step': 448},\n",
       "  {'loss': 7.913748741149902, 'step': 449},\n",
       "  {'loss': 8.205344200134277, 'step': 450},\n",
       "  {'loss': 8.171066284179688, 'step': 451},\n",
       "  {'loss': 8.055935859680176, 'step': 452},\n",
       "  {'loss': 7.965878963470459, 'step': 453},\n",
       "  {'loss': 7.880166530609131, 'step': 454},\n",
       "  {'loss': 8.065640449523926, 'step': 455},\n",
       "  {'loss': 8.152470588684082, 'step': 456},\n",
       "  {'loss': 8.121927261352539, 'step': 457},\n",
       "  {'loss': 8.06931209564209, 'step': 458},\n",
       "  {'loss': 8.177896499633789, 'step': 459},\n",
       "  {'loss': 8.104480743408203, 'step': 460},\n",
       "  {'loss': 8.01014232635498, 'step': 461},\n",
       "  {'loss': 7.989908695220947, 'step': 462},\n",
       "  {'loss': 8.030570030212402, 'step': 463},\n",
       "  {'loss': 8.284953117370605, 'step': 464},\n",
       "  {'loss': 7.988795757293701, 'step': 465},\n",
       "  {'loss': 8.102368354797363, 'step': 466},\n",
       "  {'loss': 7.949760913848877, 'step': 467},\n",
       "  {'loss': 8.292322158813477, 'step': 468},\n",
       "  {'loss': 8.191726684570312, 'step': 469},\n",
       "  {'loss': 8.011307716369629, 'step': 470},\n",
       "  {'loss': 7.7781291007995605, 'step': 471},\n",
       "  {'loss': 7.817182540893555, 'step': 472},\n",
       "  {'loss': 7.995254993438721, 'step': 473},\n",
       "  {'loss': 7.993464946746826, 'step': 474},\n",
       "  {'loss': 8.08143424987793, 'step': 475},\n",
       "  {'loss': 7.998349666595459, 'step': 476},\n",
       "  {'loss': 7.917060375213623, 'step': 477},\n",
       "  {'loss': 8.117687225341797, 'step': 478},\n",
       "  {'loss': 8.021892547607422, 'step': 479},\n",
       "  {'loss': 8.099922180175781, 'step': 480},\n",
       "  {'loss': 8.042010307312012, 'step': 481},\n",
       "  {'loss': 8.172957420349121, 'step': 482},\n",
       "  {'loss': 7.96017599105835, 'step': 483},\n",
       "  {'loss': 7.70787239074707, 'step': 484},\n",
       "  {'loss': 8.201515197753906, 'step': 485},\n",
       "  {'loss': 7.842191696166992, 'step': 486},\n",
       "  {'loss': 7.78064489364624, 'step': 487},\n",
       "  {'loss': 7.867020130157471, 'step': 488},\n",
       "  {'loss': 8.06718635559082, 'step': 489},\n",
       "  {'loss': 8.0533447265625, 'step': 490},\n",
       "  {'loss': 7.684892177581787, 'step': 491},\n",
       "  {'loss': 8.162835121154785, 'step': 492},\n",
       "  {'loss': 8.076653480529785, 'step': 493},\n",
       "  {'loss': 8.142511367797852, 'step': 494},\n",
       "  {'loss': 7.777437686920166, 'step': 495},\n",
       "  {'loss': 7.925722599029541, 'step': 496},\n",
       "  {'loss': 7.9661431312561035, 'step': 497},\n",
       "  {'loss': 7.672471523284912, 'step': 498},\n",
       "  {'loss': 7.97953462600708, 'step': 499},\n",
       "  {'loss': 8.0437650680542, 'step': 500},\n",
       "  {'loss': 7.814539432525635, 'step': 501},\n",
       "  {'loss': 8.242460250854492, 'step': 502},\n",
       "  {'loss': 8.071505546569824, 'step': 503},\n",
       "  {'loss': 8.02638053894043, 'step': 504},\n",
       "  {'loss': 7.638030052185059, 'step': 505},\n",
       "  {'loss': 7.990909576416016, 'step': 506},\n",
       "  {'loss': 7.6599907875061035, 'step': 507},\n",
       "  {'loss': 8.167756080627441, 'step': 508},\n",
       "  {'loss': 7.5305585861206055, 'step': 509},\n",
       "  {'loss': 7.80040168762207, 'step': 510},\n",
       "  {'loss': 7.665104389190674, 'step': 511},\n",
       "  {'loss': 7.535131454467773, 'step': 512},\n",
       "  {'loss': 7.814451694488525, 'step': 513},\n",
       "  {'loss': 8.01176643371582, 'step': 514},\n",
       "  {'loss': 8.010334968566895, 'step': 515},\n",
       "  {'loss': 7.775489807128906, 'step': 516},\n",
       "  {'loss': 8.125667572021484, 'step': 517},\n",
       "  {'loss': 8.067570686340332, 'step': 518},\n",
       "  {'loss': 7.604643821716309, 'step': 519},\n",
       "  {'loss': 8.097874641418457, 'step': 520},\n",
       "  {'loss': 7.92286491394043, 'step': 521},\n",
       "  {'loss': 7.9971208572387695, 'step': 522},\n",
       "  {'loss': 7.89376163482666, 'step': 523},\n",
       "  {'loss': 7.844403266906738, 'step': 524},\n",
       "  {'loss': 7.512549877166748, 'step': 525},\n",
       "  {'loss': 7.875596523284912, 'step': 526},\n",
       "  {'loss': 7.735395431518555, 'step': 527},\n",
       "  {'loss': 7.945650100708008, 'step': 528},\n",
       "  {'loss': 7.864633083343506, 'step': 529},\n",
       "  {'loss': 7.302817344665527, 'step': 530},\n",
       "  {'loss': 7.538421154022217, 'step': 531},\n",
       "  {'loss': 7.718157768249512, 'step': 532},\n",
       "  {'loss': 7.612836837768555, 'step': 533},\n",
       "  {'loss': 8.070493698120117, 'step': 534},\n",
       "  {'loss': 7.594784259796143, 'step': 535},\n",
       "  {'loss': 7.650278568267822, 'step': 536},\n",
       "  {'loss': 7.912477016448975, 'step': 537},\n",
       "  {'loss': 7.86823034286499, 'step': 538},\n",
       "  {'loss': 7.857655048370361, 'step': 539},\n",
       "  {'loss': 7.447020053863525, 'step': 540},\n",
       "  {'loss': 7.666306018829346, 'step': 541},\n",
       "  {'loss': 7.5505571365356445, 'step': 542},\n",
       "  {'loss': 7.8603010177612305, 'step': 543},\n",
       "  {'loss': 7.890242099761963, 'step': 544},\n",
       "  {'loss': 7.75024938583374, 'step': 545},\n",
       "  {'loss': 7.6072258949279785, 'step': 546},\n",
       "  {'loss': 7.664316654205322, 'step': 547},\n",
       "  {'loss': 7.807288646697998, 'step': 548},\n",
       "  {'loss': 7.687000274658203, 'step': 549},\n",
       "  {'loss': 7.401078701019287, 'step': 550},\n",
       "  {'loss': 7.726707458496094, 'step': 551},\n",
       "  {'loss': 7.735774993896484, 'step': 552},\n",
       "  {'loss': 7.387209415435791, 'step': 553},\n",
       "  {'loss': 7.803925514221191, 'step': 554},\n",
       "  {'loss': 7.868708610534668, 'step': 555},\n",
       "  {'loss': 7.3851318359375, 'step': 556},\n",
       "  {'loss': 7.386317253112793, 'step': 557},\n",
       "  {'loss': 7.486852645874023, 'step': 558},\n",
       "  {'loss': 7.495731353759766, 'step': 559},\n",
       "  {'loss': 7.785778045654297, 'step': 560},\n",
       "  {'loss': 7.540582180023193, 'step': 561},\n",
       "  {'loss': 7.65122652053833, 'step': 562},\n",
       "  {'loss': 7.620021820068359, 'step': 563},\n",
       "  {'loss': 7.578392028808594, 'step': 564},\n",
       "  {'loss': 7.25213098526001, 'step': 565},\n",
       "  {'loss': 7.269449710845947, 'step': 566},\n",
       "  {'loss': 7.720428943634033, 'step': 567},\n",
       "  {'loss': 7.4799699783325195, 'step': 568},\n",
       "  {'loss': 7.732114315032959, 'step': 569},\n",
       "  {'loss': 7.614649295806885, 'step': 570},\n",
       "  {'loss': 7.6864705085754395, 'step': 571},\n",
       "  {'loss': 7.4230241775512695, 'step': 572},\n",
       "  {'loss': 7.2391037940979, 'step': 573},\n",
       "  {'loss': 7.741705894470215, 'step': 574},\n",
       "  {'loss': 7.5787482261657715, 'step': 575},\n",
       "  {'loss': 7.508368968963623, 'step': 576},\n",
       "  {'loss': 7.392739295959473, 'step': 577},\n",
       "  {'loss': 7.77026891708374, 'step': 578},\n",
       "  {'loss': 7.523351669311523, 'step': 579},\n",
       "  {'loss': 7.618915557861328, 'step': 580},\n",
       "  {'loss': 7.266517639160156, 'step': 581},\n",
       "  {'loss': 7.545567989349365, 'step': 582},\n",
       "  {'loss': 7.451418399810791, 'step': 583},\n",
       "  {'loss': 7.582924842834473, 'step': 584},\n",
       "  {'loss': 7.110311985015869, 'step': 585},\n",
       "  {'loss': 7.3501362800598145, 'step': 586},\n",
       "  {'loss': 7.570352077484131, 'step': 587},\n",
       "  {'loss': 7.774566650390625, 'step': 588},\n",
       "  {'loss': 7.397955417633057, 'step': 589},\n",
       "  {'loss': 7.6242547035217285, 'step': 590},\n",
       "  {'loss': 7.393437385559082, 'step': 591},\n",
       "  {'loss': 7.366093158721924, 'step': 592},\n",
       "  {'loss': 7.197281837463379, 'step': 593},\n",
       "  {'loss': 7.582362174987793, 'step': 594},\n",
       "  {'loss': 7.460606098175049, 'step': 595},\n",
       "  {'loss': 7.773475646972656, 'step': 596},\n",
       "  {'loss': 7.339511871337891, 'step': 597},\n",
       "  {'loss': 7.533731460571289, 'step': 598},\n",
       "  {'loss': 7.41121768951416, 'step': 599},\n",
       "  {'loss': 7.347888469696045, 'step': 600},\n",
       "  {'loss': 7.071261405944824, 'step': 601},\n",
       "  {'loss': 7.207668781280518, 'step': 602},\n",
       "  {'loss': 7.2473015785217285, 'step': 603},\n",
       "  {'loss': 7.477840900421143, 'step': 604},\n",
       "  {'loss': 7.212743759155273, 'step': 605},\n",
       "  {'loss': 7.659752368927002, 'step': 606},\n",
       "  {'loss': 7.211424350738525, 'step': 607},\n",
       "  {'loss': 6.988909721374512, 'step': 608},\n",
       "  {'loss': 7.522782802581787, 'step': 609},\n",
       "  {'loss': 7.033238410949707, 'step': 610},\n",
       "  {'loss': 7.523828029632568, 'step': 611},\n",
       "  {'loss': 7.2602643966674805, 'step': 612},\n",
       "  {'loss': 7.195175647735596, 'step': 613},\n",
       "  {'loss': 7.0149712562561035, 'step': 614},\n",
       "  {'loss': 7.1059722900390625, 'step': 615},\n",
       "  {'loss': 7.429337501525879, 'step': 616},\n",
       "  {'loss': 7.1720051765441895, 'step': 617},\n",
       "  {'loss': 7.395434856414795, 'step': 618},\n",
       "  {'loss': 7.149226188659668, 'step': 619},\n",
       "  {'loss': 7.300187110900879, 'step': 620},\n",
       "  {'loss': 7.538472652435303, 'step': 621},\n",
       "  {'loss': 7.398463726043701, 'step': 622},\n",
       "  {'loss': 7.44061279296875, 'step': 623},\n",
       "  {'loss': 7.2641825675964355, 'step': 624},\n",
       "  {'loss': 7.182461261749268, 'step': 625},\n",
       "  {'loss': 7.143301963806152, 'step': 626},\n",
       "  {'loss': 7.489973545074463, 'step': 627},\n",
       "  {'loss': 7.292404651641846, 'step': 628},\n",
       "  {'loss': 6.901330471038818, 'step': 629},\n",
       "  {'loss': 7.238262176513672, 'step': 630},\n",
       "  {'loss': 6.832950592041016, 'step': 631},\n",
       "  {'loss': 7.431049346923828, 'step': 632},\n",
       "  {'loss': 7.475085258483887, 'step': 633},\n",
       "  {'loss': 7.550490856170654, 'step': 634},\n",
       "  {'loss': 7.0140533447265625, 'step': 635},\n",
       "  {'loss': 7.27164363861084, 'step': 636},\n",
       "  {'loss': 7.118095397949219, 'step': 637},\n",
       "  {'loss': 7.08122444152832, 'step': 638},\n",
       "  {'loss': 7.447068214416504, 'step': 639},\n",
       "  {'loss': 7.205722808837891, 'step': 640},\n",
       "  {'loss': 7.051547050476074, 'step': 641},\n",
       "  {'loss': 7.081871509552002, 'step': 642},\n",
       "  {'loss': 7.232171535491943, 'step': 643},\n",
       "  {'loss': 6.9661736488342285, 'step': 644},\n",
       "  {'loss': 6.777425765991211, 'step': 645},\n",
       "  {'loss': 7.02451229095459, 'step': 646},\n",
       "  {'loss': 7.2114033699035645, 'step': 647},\n",
       "  {'loss': 7.389755725860596, 'step': 648},\n",
       "  {'loss': 6.978205680847168, 'step': 649},\n",
       "  {'loss': 7.102064609527588, 'step': 650},\n",
       "  {'loss': 7.022010326385498, 'step': 651},\n",
       "  {'loss': 7.159557342529297, 'step': 652},\n",
       "  {'loss': 7.443429946899414, 'step': 653},\n",
       "  {'loss': 7.52020263671875, 'step': 654},\n",
       "  {'loss': 7.213403224945068, 'step': 655},\n",
       "  {'loss': 7.1154913902282715, 'step': 656},\n",
       "  {'loss': 7.260122299194336, 'step': 657},\n",
       "  {'loss': 7.007667541503906, 'step': 658},\n",
       "  {'loss': 7.167610168457031, 'step': 659},\n",
       "  {'loss': 6.914636135101318, 'step': 660},\n",
       "  {'loss': 6.99921989440918, 'step': 661},\n",
       "  {'loss': 6.975045204162598, 'step': 662},\n",
       "  {'loss': 6.866639614105225, 'step': 663},\n",
       "  {'loss': 6.736044406890869, 'step': 664},\n",
       "  {'loss': 6.918704986572266, 'step': 665},\n",
       "  {'loss': 7.391820907592773, 'step': 666},\n",
       "  {'loss': 7.239866256713867, 'step': 667},\n",
       "  {'loss': 6.988378047943115, 'step': 668},\n",
       "  {'loss': 6.688178062438965, 'step': 669},\n",
       "  {'loss': 6.662519931793213, 'step': 670},\n",
       "  {'loss': 7.094308376312256, 'step': 671},\n",
       "  {'loss': 7.291316509246826, 'step': 672},\n",
       "  {'loss': 7.19984769821167, 'step': 673},\n",
       "  {'loss': 7.083631992340088, 'step': 674},\n",
       "  {'loss': 7.171677589416504, 'step': 675},\n",
       "  {'loss': 7.049585819244385, 'step': 676},\n",
       "  {'loss': 6.954865455627441, 'step': 677},\n",
       "  {'loss': 7.118834972381592, 'step': 678},\n",
       "  {'loss': 6.863336563110352, 'step': 679},\n",
       "  {'loss': 6.854741096496582, 'step': 680},\n",
       "  {'loss': 7.0341796875, 'step': 681},\n",
       "  {'loss': 7.145971298217773, 'step': 682},\n",
       "  {'loss': 7.037364482879639, 'step': 683},\n",
       "  {'loss': 6.9741902351379395, 'step': 684},\n",
       "  {'loss': 6.877047538757324, 'step': 685},\n",
       "  {'loss': 6.950554370880127, 'step': 686},\n",
       "  {'loss': 6.821767330169678, 'step': 687},\n",
       "  {'loss': 6.88207483291626, 'step': 688},\n",
       "  {'loss': 7.279383659362793, 'step': 689},\n",
       "  {'loss': 6.997432708740234, 'step': 690},\n",
       "  {'loss': 6.997828483581543, 'step': 691},\n",
       "  {'loss': 6.996527671813965, 'step': 692},\n",
       "  {'loss': 6.659179210662842, 'step': 693},\n",
       "  {'loss': 6.847641944885254, 'step': 694},\n",
       "  {'loss': 6.970363140106201, 'step': 695},\n",
       "  {'loss': 6.86218786239624, 'step': 696},\n",
       "  {'loss': 7.037300109863281, 'step': 697},\n",
       "  {'loss': 6.773055076599121, 'step': 698},\n",
       "  {'loss': 7.076780319213867, 'step': 699},\n",
       "  {'loss': 7.013121128082275, 'step': 700},\n",
       "  {'loss': 6.520520210266113, 'step': 701},\n",
       "  {'loss': 6.879832744598389, 'step': 702},\n",
       "  {'loss': 6.989772796630859, 'step': 703},\n",
       "  {'loss': 7.194024562835693, 'step': 704},\n",
       "  {'loss': 7.0258893966674805, 'step': 705},\n",
       "  {'loss': 6.753869533538818, 'step': 706},\n",
       "  {'loss': 6.864961624145508, 'step': 707},\n",
       "  {'loss': 6.937998294830322, 'step': 708},\n",
       "  {'loss': 7.084530830383301, 'step': 709},\n",
       "  {'loss': 6.982689380645752, 'step': 710},\n",
       "  {'loss': 6.737189769744873, 'step': 711},\n",
       "  {'loss': 6.802628517150879, 'step': 712},\n",
       "  {'loss': 6.947933673858643, 'step': 713},\n",
       "  {'loss': 6.958893775939941, 'step': 714},\n",
       "  {'loss': 6.8615241050720215, 'step': 715},\n",
       "  {'loss': 7.305059432983398, 'step': 716},\n",
       "  {'loss': 6.8294501304626465, 'step': 717},\n",
       "  {'loss': 7.1108174324035645, 'step': 718},\n",
       "  {'loss': 6.769628047943115, 'step': 719},\n",
       "  {'loss': 6.760581016540527, 'step': 720},\n",
       "  {'loss': 6.760366916656494, 'step': 721},\n",
       "  {'loss': 7.042566299438477, 'step': 722},\n",
       "  {'loss': 7.034431457519531, 'step': 723},\n",
       "  {'loss': 6.852402687072754, 'step': 724},\n",
       "  {'loss': 6.75730562210083, 'step': 725},\n",
       "  {'loss': 6.717425346374512, 'step': 726},\n",
       "  {'loss': 6.852350234985352, 'step': 727},\n",
       "  {'loss': 6.6492838859558105, 'step': 728},\n",
       "  {'loss': 6.483761310577393, 'step': 729},\n",
       "  {'loss': 6.8733086585998535, 'step': 730},\n",
       "  {'loss': 6.572723388671875, 'step': 731},\n",
       "  {'loss': 6.956902503967285, 'step': 732},\n",
       "  {'loss': 6.614252090454102, 'step': 733},\n",
       "  {'loss': 7.125187873840332, 'step': 734},\n",
       "  {'loss': 6.689329624176025, 'step': 735},\n",
       "  {'loss': 6.5432658195495605, 'step': 736},\n",
       "  {'loss': 6.824548721313477, 'step': 737},\n",
       "  {'loss': 6.721471786499023, 'step': 738},\n",
       "  {'loss': 6.859453201293945, 'step': 739},\n",
       "  {'loss': 6.616372108459473, 'step': 740},\n",
       "  {'loss': 6.4183735847473145, 'step': 741},\n",
       "  {'loss': 6.656620025634766, 'step': 742},\n",
       "  {'loss': 6.9346795082092285, 'step': 743},\n",
       "  {'loss': 6.432536602020264, 'step': 744},\n",
       "  {'loss': 7.161305904388428, 'step': 745},\n",
       "  {'loss': 6.641730308532715, 'step': 746},\n",
       "  {'loss': 6.544776439666748, 'step': 747},\n",
       "  {'loss': 6.885766506195068, 'step': 748},\n",
       "  {'loss': 6.844192981719971, 'step': 749},\n",
       "  {'loss': 6.607378959655762, 'step': 750},\n",
       "  {'loss': 6.848850727081299, 'step': 751},\n",
       "  {'loss': 6.927807331085205, 'step': 752},\n",
       "  {'loss': 6.810379981994629, 'step': 753},\n",
       "  {'loss': 6.337887287139893, 'step': 754},\n",
       "  {'loss': 6.39518404006958, 'step': 755},\n",
       "  {'loss': 6.7049360275268555, 'step': 756},\n",
       "  {'loss': 6.911135196685791, 'step': 757},\n",
       "  {'loss': 6.956777572631836, 'step': 758},\n",
       "  {'loss': 6.505741119384766, 'step': 759},\n",
       "  {'loss': 6.772039413452148, 'step': 760},\n",
       "  {'loss': 7.023849964141846, 'step': 761},\n",
       "  {'loss': 6.5257463455200195, 'step': 762},\n",
       "  {'loss': 6.91315221786499, 'step': 763},\n",
       "  {'loss': 6.865330696105957, 'step': 764},\n",
       "  {'loss': 6.8075690269470215, 'step': 765},\n",
       "  {'loss': 6.820396423339844, 'step': 766},\n",
       "  {'loss': 6.690125942230225, 'step': 767},\n",
       "  {'loss': 6.613508224487305, 'step': 768},\n",
       "  {'loss': 6.357395172119141, 'step': 769},\n",
       "  {'loss': 6.485246658325195, 'step': 770},\n",
       "  {'loss': 6.374847412109375, 'step': 771},\n",
       "  {'loss': 6.724035263061523, 'step': 772},\n",
       "  {'loss': 6.465813159942627, 'step': 773},\n",
       "  {'loss': 7.115317344665527, 'step': 774},\n",
       "  {'loss': 6.669405460357666, 'step': 775},\n",
       "  {'loss': 6.405550956726074, 'step': 776},\n",
       "  {'loss': 6.648141860961914, 'step': 777},\n",
       "  {'loss': 6.783753871917725, 'step': 778},\n",
       "  {'loss': 6.364537715911865, 'step': 779},\n",
       "  {'loss': 6.684432029724121, 'step': 780},\n",
       "  {'loss': 6.318944931030273, 'step': 781},\n",
       "  {'loss': 6.516211986541748, 'step': 782},\n",
       "  {'loss': 6.519916534423828, 'step': 783},\n",
       "  {'loss': 6.910676956176758, 'step': 784},\n",
       "  {'loss': 6.888895034790039, 'step': 785},\n",
       "  {'loss': 6.182254791259766, 'step': 786},\n",
       "  {'loss': 6.530108451843262, 'step': 787},\n",
       "  {'loss': 7.004254341125488, 'step': 788},\n",
       "  {'loss': 6.5809125900268555, 'step': 789},\n",
       "  {'loss': 6.338730335235596, 'step': 790},\n",
       "  {'loss': 6.62152099609375, 'step': 791},\n",
       "  {'loss': 6.903307914733887, 'step': 792},\n",
       "  {'loss': 6.338919639587402, 'step': 793},\n",
       "  {'loss': 6.317656993865967, 'step': 794},\n",
       "  {'loss': 6.30381441116333, 'step': 795},\n",
       "  {'loss': 7.0547075271606445, 'step': 796},\n",
       "  {'loss': 6.36769437789917, 'step': 797},\n",
       "  {'loss': 5.969470024108887, 'step': 798},\n",
       "  {'loss': 6.383159637451172, 'step': 799},\n",
       "  {'loss': 6.547619819641113, 'step': 800},\n",
       "  {'loss': 6.328559875488281, 'step': 801},\n",
       "  {'loss': 6.864226818084717, 'step': 802},\n",
       "  {'loss': 6.587944507598877, 'step': 803},\n",
       "  {'loss': 6.648940563201904, 'step': 804},\n",
       "  {'loss': 6.6195969581604, 'step': 805},\n",
       "  {'loss': 6.563567638397217, 'step': 806},\n",
       "  {'loss': 6.611572265625, 'step': 807},\n",
       "  {'loss': 6.68995475769043, 'step': 808},\n",
       "  {'loss': 6.564111709594727, 'step': 809},\n",
       "  {'loss': 6.686050891876221, 'step': 810},\n",
       "  {'loss': 6.434352874755859, 'step': 811},\n",
       "  {'loss': 6.708085060119629, 'step': 812},\n",
       "  {'loss': 6.850421905517578, 'step': 813},\n",
       "  {'loss': 6.699295520782471, 'step': 814},\n",
       "  {'loss': 6.424786567687988, 'step': 815},\n",
       "  {'loss': 6.5352702140808105, 'step': 816},\n",
       "  {'loss': 6.123636722564697, 'step': 817},\n",
       "  {'loss': 5.954287528991699, 'step': 818},\n",
       "  {'loss': 6.480729579925537, 'step': 819},\n",
       "  {'loss': 5.910040855407715, 'step': 820},\n",
       "  {'loss': 6.948694229125977, 'step': 821},\n",
       "  {'loss': 6.853066921234131, 'step': 822},\n",
       "  {'loss': 6.512876033782959, 'step': 823},\n",
       "  {'loss': 6.743638515472412, 'step': 824},\n",
       "  {'loss': 6.408699035644531, 'step': 825},\n",
       "  {'loss': 6.020792484283447, 'step': 826},\n",
       "  {'loss': 5.936334133148193, 'step': 827},\n",
       "  {'loss': 6.543078899383545, 'step': 828},\n",
       "  {'loss': 6.6776652336120605, 'step': 829},\n",
       "  {'loss': 6.248559951782227, 'step': 830},\n",
       "  {'loss': 5.888497829437256, 'step': 831},\n",
       "  {'loss': 6.26070499420166, 'step': 832},\n",
       "  {'loss': 6.3839006423950195, 'step': 833},\n",
       "  {'loss': 6.263967037200928, 'step': 834},\n",
       "  {'loss': 6.724107265472412, 'step': 835},\n",
       "  {'loss': 5.902020454406738, 'step': 836},\n",
       "  {'loss': 6.562924861907959, 'step': 837},\n",
       "  {'loss': 7.004419803619385, 'step': 838},\n",
       "  {'loss': 6.426488399505615, 'step': 839},\n",
       "  {'loss': 6.724635601043701, 'step': 840},\n",
       "  {'loss': 6.675295829772949, 'step': 841},\n",
       "  {'loss': 6.502694606781006, 'step': 842},\n",
       "  {'loss': 6.503321170806885, 'step': 843},\n",
       "  {'loss': 6.245606422424316, 'step': 844},\n",
       "  {'loss': 6.191976547241211, 'step': 845},\n",
       "  {'loss': 6.8523945808410645, 'step': 846},\n",
       "  {'loss': 6.353005886077881, 'step': 847},\n",
       "  {'loss': 5.988899230957031, 'step': 848},\n",
       "  {'loss': 6.364284038543701, 'step': 849},\n",
       "  {'loss': 6.762622833251953, 'step': 850},\n",
       "  {'loss': 6.629905700683594, 'step': 851},\n",
       "  {'loss': 6.704689025878906, 'step': 852},\n",
       "  {'loss': 6.609033107757568, 'step': 853},\n",
       "  {'loss': 5.894676208496094, 'step': 854},\n",
       "  {'loss': 6.525979518890381, 'step': 855},\n",
       "  {'loss': 6.35510778427124, 'step': 856},\n",
       "  {'loss': 6.19965934753418, 'step': 857},\n",
       "  {'loss': 6.2351884841918945, 'step': 858},\n",
       "  {'loss': 6.208929061889648, 'step': 859},\n",
       "  {'loss': 6.207033634185791, 'step': 860},\n",
       "  {'loss': 6.3814473152160645, 'step': 861},\n",
       "  {'loss': 6.416205883026123, 'step': 862},\n",
       "  {'loss': 6.356717109680176, 'step': 863},\n",
       "  {'loss': 6.7983808517456055, 'step': 864},\n",
       "  {'loss': 6.480618476867676, 'step': 865},\n",
       "  {'loss': 6.0034003257751465, 'step': 866},\n",
       "  {'loss': 6.14583158493042, 'step': 867},\n",
       "  {'loss': 6.309615135192871, 'step': 868},\n",
       "  {'loss': 5.988375186920166, 'step': 869},\n",
       "  {'loss': 6.381168365478516, 'step': 870},\n",
       "  {'loss': 6.632688045501709, 'step': 871},\n",
       "  {'loss': 5.765840530395508, 'step': 872},\n",
       "  {'loss': 6.271056175231934, 'step': 873},\n",
       "  {'loss': 6.522463798522949, 'step': 874},\n",
       "  {'loss': 6.040472030639648, 'step': 875},\n",
       "  {'loss': 5.9789838790893555, 'step': 876},\n",
       "  {'loss': 6.343785285949707, 'step': 877},\n",
       "  {'loss': 6.179426670074463, 'step': 878},\n",
       "  {'loss': 6.322490215301514, 'step': 879},\n",
       "  {'loss': 6.034120082855225, 'step': 880},\n",
       "  {'loss': 5.879203796386719, 'step': 881},\n",
       "  {'loss': 6.482491970062256, 'step': 882},\n",
       "  {'loss': 5.860864162445068, 'step': 883},\n",
       "  {'loss': 6.218107223510742, 'step': 884},\n",
       "  {'loss': 5.957141876220703, 'step': 885},\n",
       "  {'loss': 6.286118507385254, 'step': 886},\n",
       "  {'loss': 6.313652992248535, 'step': 887},\n",
       "  {'loss': 6.308793544769287, 'step': 888},\n",
       "  {'loss': 6.23609733581543, 'step': 889},\n",
       "  {'loss': 6.690971374511719, 'step': 890},\n",
       "  {'loss': 5.963109970092773, 'step': 891},\n",
       "  {'loss': 6.2452898025512695, 'step': 892},\n",
       "  {'loss': 6.63107967376709, 'step': 893},\n",
       "  {'loss': 6.797604084014893, 'step': 894},\n",
       "  {'loss': 5.950381755828857, 'step': 895},\n",
       "  {'loss': 6.572484970092773, 'step': 896},\n",
       "  {'loss': 6.511791229248047, 'step': 897},\n",
       "  {'loss': 6.66938591003418, 'step': 898},\n",
       "  {'loss': 6.168297290802002, 'step': 899},\n",
       "  {'loss': 5.944812774658203, 'step': 900},\n",
       "  {'loss': 5.701686859130859, 'step': 901},\n",
       "  {'loss': 5.792239665985107, 'step': 902},\n",
       "  {'loss': 6.648144245147705, 'step': 903},\n",
       "  {'loss': 6.368889331817627, 'step': 904},\n",
       "  {'loss': 6.3829731941223145, 'step': 905},\n",
       "  {'loss': 5.805069923400879, 'step': 906},\n",
       "  {'loss': 6.1689934730529785, 'step': 907},\n",
       "  {'loss': 6.269593238830566, 'step': 908},\n",
       "  {'loss': 6.178995609283447, 'step': 909},\n",
       "  {'loss': 6.09274959564209, 'step': 910},\n",
       "  {'loss': 6.249297142028809, 'step': 911},\n",
       "  {'loss': 6.512197494506836, 'step': 912},\n",
       "  {'loss': 5.983043193817139, 'step': 913},\n",
       "  {'loss': 6.0046772956848145, 'step': 914},\n",
       "  {'loss': 6.130101203918457, 'step': 915},\n",
       "  {'loss': 5.838685035705566, 'step': 916},\n",
       "  {'loss': 5.722689628601074, 'step': 917},\n",
       "  {'loss': 6.457564353942871, 'step': 918},\n",
       "  {'loss': 6.757653713226318, 'step': 919},\n",
       "  {'loss': 6.605216026306152, 'step': 920},\n",
       "  {'loss': 6.445562362670898, 'step': 921},\n",
       "  {'loss': 5.902590274810791, 'step': 922},\n",
       "  {'loss': 6.408598899841309, 'step': 923},\n",
       "  {'loss': 5.833204746246338, 'step': 924},\n",
       "  {'loss': 6.3142876625061035, 'step': 925},\n",
       "  {'loss': 6.453734397888184, 'step': 926},\n",
       "  {'loss': 6.01493501663208, 'step': 927},\n",
       "  {'loss': 6.285869598388672, 'step': 928},\n",
       "  {'loss': 6.398525714874268, 'step': 929},\n",
       "  {'loss': 6.137470722198486, 'step': 930},\n",
       "  {'loss': 6.273024559020996, 'step': 931},\n",
       "  {'loss': 6.1685967445373535, 'step': 932},\n",
       "  {'loss': 6.008051872253418, 'step': 933},\n",
       "  {'loss': 6.185734748840332, 'step': 934},\n",
       "  {'loss': 5.900341033935547, 'step': 935},\n",
       "  {'loss': 5.744045257568359, 'step': 936},\n",
       "  {'loss': 5.823700428009033, 'step': 937},\n",
       "  {'loss': 5.728030681610107, 'step': 938},\n",
       "  {'loss': 6.049435615539551, 'step': 939},\n",
       "  {'loss': 6.49831485748291, 'step': 940},\n",
       "  {'loss': 6.177751541137695, 'step': 941},\n",
       "  {'loss': 6.148321628570557, 'step': 942},\n",
       "  {'loss': 6.225390434265137, 'step': 943},\n",
       "  {'loss': 6.398477554321289, 'step': 944},\n",
       "  {'loss': 5.952963829040527, 'step': 945},\n",
       "  {'loss': 6.1268696784973145, 'step': 946},\n",
       "  {'loss': 5.807882785797119, 'step': 947},\n",
       "  {'loss': 5.973855972290039, 'step': 948},\n",
       "  {'loss': 5.957612037658691, 'step': 949},\n",
       "  {'loss': 6.507503509521484, 'step': 950},\n",
       "  {'loss': 6.276659965515137, 'step': 951},\n",
       "  {'loss': 6.001067638397217, 'step': 952},\n",
       "  {'loss': 6.263331890106201, 'step': 953},\n",
       "  {'loss': 5.860982418060303, 'step': 954},\n",
       "  {'loss': 6.645760536193848, 'step': 955},\n",
       "  {'loss': 5.82780647277832, 'step': 956},\n",
       "  {'loss': 6.261649131774902, 'step': 957},\n",
       "  {'loss': 6.591831684112549, 'step': 958},\n",
       "  {'loss': 6.315814018249512, 'step': 959},\n",
       "  {'loss': 6.262245178222656, 'step': 960},\n",
       "  {'loss': 6.140352249145508, 'step': 961},\n",
       "  {'loss': 5.966010570526123, 'step': 962},\n",
       "  {'loss': 5.838812351226807, 'step': 963},\n",
       "  {'loss': 6.004377365112305, 'step': 964},\n",
       "  {'loss': 6.415785312652588, 'step': 965},\n",
       "  {'loss': 6.068878650665283, 'step': 966},\n",
       "  {'loss': 6.3952789306640625, 'step': 967},\n",
       "  {'loss': 6.041214466094971, 'step': 968},\n",
       "  {'loss': 6.329691410064697, 'step': 969},\n",
       "  {'loss': 5.771971702575684, 'step': 970},\n",
       "  {'loss': 5.971766471862793, 'step': 971},\n",
       "  {'loss': 5.776097774505615, 'step': 972},\n",
       "  {'loss': 5.969609260559082, 'step': 973},\n",
       "  {'loss': 5.3401665687561035, 'step': 974},\n",
       "  {'loss': 5.6951775550842285, 'step': 975},\n",
       "  {'loss': 6.266172409057617, 'step': 976},\n",
       "  {'loss': 6.266575813293457, 'step': 977},\n",
       "  {'loss': 6.406030654907227, 'step': 978},\n",
       "  {'loss': 5.62742280960083, 'step': 979},\n",
       "  {'loss': 6.34892463684082, 'step': 980},\n",
       "  {'loss': 6.298324108123779, 'step': 981},\n",
       "  {'loss': 5.872703552246094, 'step': 982},\n",
       "  {'loss': 6.081480503082275, 'step': 983},\n",
       "  {'loss': 5.950186729431152, 'step': 984},\n",
       "  {'loss': 5.948841571807861, 'step': 985},\n",
       "  {'loss': 5.468770980834961, 'step': 986},\n",
       "  {'loss': 5.812047004699707, 'step': 987},\n",
       "  {'loss': 6.238697052001953, 'step': 988},\n",
       "  {'loss': 5.943714618682861, 'step': 989},\n",
       "  {'loss': 5.874351501464844, 'step': 990},\n",
       "  {'loss': 5.849545955657959, 'step': 991},\n",
       "  {'loss': 5.782496929168701, 'step': 992},\n",
       "  {'loss': 5.941040515899658, 'step': 993},\n",
       "  {'loss': 6.118348598480225, 'step': 994},\n",
       "  {'loss': 6.164992332458496, 'step': 995},\n",
       "  {'loss': 6.171815872192383, 'step': 996},\n",
       "  {'loss': 6.056739330291748, 'step': 997},\n",
       "  {'loss': 6.125406265258789, 'step': 998},\n",
       "  {'loss': 6.453649520874023, 'step': 999},\n",
       "  {'loss': 6.709085941314697, 'step': 1000},\n",
       "  ...],\n",
       " 'val': [{'loss': 7.821493434906006, 'step': 500},\n",
       "  {'loss': 6.027450430393219, 'step': 1000},\n",
       "  {'loss': 5.600744354724884, 'step': 1500},\n",
       "  {'loss': 5.298193943500519, 'step': 2000},\n",
       "  {'loss': 5.071680128574371, 'step': 2500},\n",
       "  {'loss': 4.879912614822388, 'step': 3000},\n",
       "  {'loss': 4.769975155591965, 'step': 3500},\n",
       "  {'loss': 4.574173611402512, 'step': 4000},\n",
       "  {'loss': 4.502698236703873, 'step': 4500},\n",
       "  {'loss': 4.364873617887497, 'step': 5000},\n",
       "  {'loss': 4.2782000541687015, 'step': 5500},\n",
       "  {'loss': 4.211360436677933, 'step': 6000},\n",
       "  {'loss': 4.188488036394119, 'step': 6500},\n",
       "  {'loss': 4.102499371767044, 'step': 7000},\n",
       "  {'loss': 4.062851971387863, 'step': 7500},\n",
       "  {'loss': 3.9902072668075563, 'step': 8000},\n",
       "  {'loss': 3.9650499522686005, 'step': 8500},\n",
       "  {'loss': 3.925666666030884, 'step': 9000},\n",
       "  {'loss': 3.8836489021778107, 'step': 9500},\n",
       "  {'loss': 3.8748318433761595, 'step': 10000},\n",
       "  {'loss': 3.8291358172893526, 'step': 10500},\n",
       "  {'loss': 3.806366020441055, 'step': 11000},\n",
       "  {'loss': 3.7824321925640105, 'step': 11500},\n",
       "  {'loss': 3.7634251773357392, 'step': 12000},\n",
       "  {'loss': 3.7501733899116516, 'step': 12500},\n",
       "  {'loss': 3.7178340435028074, 'step': 13000},\n",
       "  {'loss': 3.697151947021484, 'step': 13500},\n",
       "  {'loss': 3.6722818672657014, 'step': 14000},\n",
       "  {'loss': 3.6709179639816285, 'step': 14500},\n",
       "  {'loss': 3.660598397254944, 'step': 15000},\n",
       "  {'loss': 3.630389577150345, 'step': 15500},\n",
       "  {'loss': 3.6187003195285796, 'step': 16000},\n",
       "  {'loss': 3.612043309211731, 'step': 16500},\n",
       "  {'loss': 3.60474870800972, 'step': 17000},\n",
       "  {'loss': 3.585008317232132, 'step': 17500},\n",
       "  {'loss': 3.573343354463577, 'step': 18000},\n",
       "  {'loss': 3.5669531881809236, 'step': 18500},\n",
       "  {'loss': 3.548370498418808, 'step': 19000},\n",
       "  {'loss': 3.5472674548625944, 'step': 19500},\n",
       "  {'loss': 3.530187278985977, 'step': 20000},\n",
       "  {'loss': 3.5355210483074186, 'step': 20500},\n",
       "  {'loss': 3.517650604248047, 'step': 21000},\n",
       "  {'loss': 3.5152146399021147, 'step': 21500},\n",
       "  {'loss': 3.497622090578079, 'step': 22000},\n",
       "  {'loss': 3.487902492284775, 'step': 22500},\n",
       "  {'loss': 3.4901738345623015, 'step': 23000},\n",
       "  {'loss': 3.474150460958481, 'step': 23500},\n",
       "  {'loss': 3.4717553853988647, 'step': 24000},\n",
       "  {'loss': 3.4705767750740053, 'step': 24500},\n",
       "  {'loss': 3.4573165237903596, 'step': 25000},\n",
       "  {'loss': 3.4698963165283203, 'step': 25500},\n",
       "  {'loss': 3.4639424622058868, 'step': 26000},\n",
       "  {'loss': 3.475884920358658, 'step': 26500},\n",
       "  {'loss': 3.456137365102768, 'step': 27000},\n",
       "  {'loss': 3.450688678026199, 'step': 27500},\n",
       "  {'loss': 3.4436807513236998, 'step': 28000},\n",
       "  {'loss': 3.4479224026203155, 'step': 28500},\n",
       "  {'loss': 3.4404270172119142, 'step': 29000},\n",
       "  {'loss': 3.441426146030426, 'step': 29500},\n",
       "  {'loss': 3.454250419139862, 'step': 30000},\n",
       "  {'loss': 3.4406341195106505, 'step': 30500},\n",
       "  {'loss': 3.4432278692722322, 'step': 31000},\n",
       "  {'loss': 3.4312688946723937, 'step': 31500},\n",
       "  {'loss': 3.437841659784317, 'step': 32000},\n",
       "  {'loss': 3.4345434308052063, 'step': 32500},\n",
       "  {'loss': 3.4375308394432067, 'step': 33000},\n",
       "  {'loss': 3.4406104505062105, 'step': 33500},\n",
       "  {'loss': 3.443833065032959, 'step': 34000},\n",
       "  {'loss': 3.4342720568180085, 'step': 34500},\n",
       "  {'loss': 3.4486622154712676, 'step': 35000},\n",
       "  {'loss': 3.4457090973854063, 'step': 35500},\n",
       "  {'loss': 3.4440481901168822, 'step': 36000},\n",
       "  {'loss': 3.4411915600299836, 'step': 36500}]}"
      ]
     },
     "execution_count": 66,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "record"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "rTjbeFlIN4yZ"
   },
   "source": [
    "## 推理\n",
    "\n",
    "- 翻译项目的评估指标一般是BLEU4\n",
    "- 接下来进行翻译推理，并作出注意力的热度图"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {
    "ExecutionIndicator": {
     "show": true
    },
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T02:03:41.720740Z",
     "iopub.status.busy": "2025-02-07T02:03:41.720413Z",
     "iopub.status.idle": "2025-02-07T02:03:50.822395Z",
     "shell.execute_reply": "2025-02-07T02:03:50.821742Z",
     "shell.execute_reply.started": "2025-02-07T02:03:41.720715Z"
    },
    "id": "WxsjkyQgN4yZ",
    "outputId": "5ce160c2-ce7e-4bc3-d2b6-a332c7fcf6a1",
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Looking in indexes: https://mirrors.cloud.aliyuncs.com/pypi/simple\n",
      "Requirement already satisfied: Cython in /usr/local/lib/python3.10/site-packages (3.0.11)\n",
      "\u001B[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001B[0m\u001B[33m\n",
      "\u001B[0m\n",
      "\u001B[1m[\u001B[0m\u001B[34;49mnotice\u001B[0m\u001B[1;39;49m]\u001B[0m\u001B[39;49m A new release of pip is available: \u001B[0m\u001B[31;49m23.3.2\u001B[0m\u001B[39;49m -> \u001B[0m\u001B[32;49m25.0\u001B[0m\n",
      "\u001B[1m[\u001B[0m\u001B[34;49mnotice\u001B[0m\u001B[1;39;49m]\u001B[0m\u001B[39;49m To update, run: \u001B[0m\u001B[32;49mpip install --upgrade pip\u001B[0m\n",
      "Looking in indexes: https://mirrors.cloud.aliyuncs.com/pypi/simple\n",
      "Requirement already satisfied: fastBPE in /usr/local/lib/python3.10/site-packages (0.1.0)\n",
      "\u001B[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001B[0m\u001B[33m\n",
      "\u001B[0m\n",
      "\u001B[1m[\u001B[0m\u001B[34;49mnotice\u001B[0m\u001B[1;39;49m]\u001B[0m\u001B[39;49m A new release of pip is available: \u001B[0m\u001B[31;49m23.3.2\u001B[0m\u001B[39;49m -> \u001B[0m\u001B[32;49m25.0\u001B[0m\n",
      "\u001B[1m[\u001B[0m\u001B[34;49mnotice\u001B[0m\u001B[1;39;49m]\u001B[0m\u001B[39;49m To update, run: \u001B[0m\u001B[32;49mpip install --upgrade pip\u001B[0m\n"
     ]
    }
   ],
   "source": [
    "!pip install Cython  # if failed to install fastBPE, try this line\n",
    "!pip install fastBPE #分词使用\n",
    "# 在 Windows 系统上并没有 sys/mman.h 文件"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 35
    },
    "execution": {
     "iopub.execute_input": "2025-01-22T08:58:14.440256Z",
     "iopub.status.busy": "2025-01-22T08:58:14.440059Z",
     "iopub.status.idle": "2025-01-22T08:58:14.443992Z",
     "shell.execute_reply": "2025-01-22T08:58:14.443607Z",
     "shell.execute_reply.started": "2025-01-22T08:58:14.440225Z"
    },
    "id": "f6Ry1PcAn4k1",
    "outputId": "6393524e-e5c3-4f93-dd9d-f249ca52bc05"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'translate-transformer-not-share'"
      ]
     },
     "execution_count": 100,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "exp_name"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {
    "ExecutionIndicator": {
     "show": true
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T02:03:58.107901Z",
     "iopub.status.busy": "2025-02-07T02:03:58.107512Z",
     "iopub.status.idle": "2025-02-07T02:03:58.232712Z",
     "shell.execute_reply": "2025-02-07T02:03:58.232076Z",
     "shell.execute_reply.started": "2025-02-07T02:03:58.107875Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "总计 281580\n",
      "-rw-r--r-- 1 root root 288336196  1月 22 17:32 best.ckpt\n"
     ]
    }
   ],
   "source": [
    "!ls checkpoints/translate-transformer-not-share -l"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T03:10:32.326542400Z",
     "start_time": "2024-08-05T03:10:31.006376300Z"
    },
    "ExecutionIndicator": {
     "show": true
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T02:26:24.023923Z",
     "iopub.status.busy": "2025-02-07T02:26:24.023567Z",
     "iopub.status.idle": "2025-02-07T02:26:24.195951Z",
     "shell.execute_reply": "2025-02-07T02:26:24.195219Z",
     "shell.execute_reply.started": "2025-02-07T02:26:24.023899Z"
    },
    "id": "jT1Mqiq3N4yZ",
    "tags": []
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/tmp/ipykernel_335/44154657.py:3: FutureWarning: You are using `torch.load` with `weights_only=False` (the current default value), which uses the default pickle module implicitly. It is possible to construct malicious pickle data which will execute arbitrary code during unpickling (See https://github.com/pytorch/pytorch/blob/main/SECURITY.md#untrusted-models for more details). In a future release, the default value for `weights_only` will be flipped to `True`. This limits the functions that could be executed during unpickling. Arbitrary objects will no longer be allowed to be loaded via this mode unless they are explicitly allowlisted by the user via `torch.serialization.add_safe_globals`. We recommend you start setting `weights_only=True` for any use case where you don't have full control of the loaded file. Please open an issue on GitHub for any issues related to this experimental feature.\n",
      "  state_dict = torch.load(f\"checkpoints/translate-transformer-not-share/best.ckpt\", map_location=device)\n"
     ]
    }
   ],
   "source": [
    "import torch\n",
    "\n",
    "state_dict = torch.load(f\"checkpoints/translate-transformer-not-share/best.ckpt\", map_location=device)\n",
    "\n",
    "# state_dict1 = torch.load(\"epoch125-step132426.ckpt\", map_location=\"cpu\")\n",
    "# state_dict = state_dict1[\"state_dict\"]\n",
    "\n",
    "# update keys by dropping `model`\n",
    "# for key in list(state_dict):\n",
    "#     state_dict[key.replace(\"model.\", \"\")] = state_dict.pop(key)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-08-05T03:10:46.720508800Z",
     "start_time": "2024-08-05T03:10:36.179313900Z"
    },
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "execution": {
     "iopub.status.busy": "2025-01-22T08:58:14.581445Z",
     "iopub.status.idle": "2025-01-22T08:58:14.581630Z",
     "shell.execute_reply": "2025-01-22T08:58:14.581547Z",
     "shell.execute_reply.started": "2025-01-22T08:58:14.581539Z"
    },
    "id": "eKwIDdjgvTlO",
    "outputId": "35979ff2-a16d-4aa4-881a-8496e39e2469"
   },
   "outputs": [],
   "source": [
    "!pip install nltk"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "execution": {
     "iopub.status.busy": "2025-01-22T08:58:14.582226Z",
     "iopub.status.idle": "2025-01-22T08:58:14.582510Z",
     "shell.execute_reply": "2025-01-22T08:58:14.582426Z",
     "shell.execute_reply.started": "2025-01-22T08:58:14.582417Z"
    },
    "id": "WVksjIhL_pt9"
   },
   "outputs": [],
   "source": [
    "!rm -r wmt16/.cache"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "execution": {
     "iopub.status.busy": "2025-01-22T08:58:14.583127Z",
     "iopub.status.idle": "2025-01-22T08:58:14.583307Z",
     "shell.execute_reply": "2025-01-22T08:58:14.583221Z",
     "shell.execute_reply.started": "2025-01-22T08:58:14.583213Z"
    },
    "id": "2MY69-6WWSjp",
    "outputId": "911d9066-7917-4917-b5cc-d679a1c63865"
   },
   "outputs": [],
   "source": [
    "tokenizer.decode([[   5,   16,    6,   23,  150,   80, 8248,   35,  232,    4,    3]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 101,
     "referenced_widgets": [
      "c9db4cd83b7b4f53a0fa93b8c365debd",
      "a972aba7913b48c6973ae27bff5b9d1d",
      "22aa774ab39e4fd78b0ff08d430d2b5d",
      "9a01f02fb99b4b81ac487d23bc5daf4a",
      "19f846338f6b48c9930b58575641e5b8",
      "7d293204dc1b4d97bb5ee670787c7b7d",
      "ea8fa440f320435aa75c9bef75bc3f08",
      "4e64bcb87e584beda0408a0aa5a659ae",
      "b077d7562d814df5b6d839464dd4122f",
      "5a28babf4e2e4393bdc1a093034885ab",
      "be07d518c21149d196c610fd57b1eaec"
     ]
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T02:45:30.305427Z",
     "iopub.status.busy": "2025-02-07T02:45:30.305070Z",
     "iopub.status.idle": "2025-02-07T02:45:41.959985Z",
     "shell.execute_reply": "2025-02-07T02:45:41.959493Z",
     "shell.execute_reply.started": "2025-02-07T02:45:30.305398Z"
    },
    "id": "5QgodlOJfgKj",
    "outputId": "2907bad2-7cb1-4295-c8b0-77ac0dabf398",
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "load test dataset from wmt16/.cache/de2en_test_128.npy\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "0it [00:00, ?it/s]/usr/local/lib/python3.10/site-packages/torch/nn/_reduction.py:51: UserWarning: size_average and reduce args will be deprecated, please use reduction='none' instead.\n",
      "  warnings.warn(warning.format(ret))\n",
      "1it [00:00,  3.39it/s]/usr/local/lib/python3.10/site-packages/nltk/translate/bleu_score.py:577: UserWarning: \n",
      "The hypothesis contains 0 counts of 4-gram overlaps.\n",
      "Therefore the BLEU score evaluates to 0, independently of\n",
      "how many N-gram overlaps of lower order it contains.\n",
      "Consider using lower n-gram order or use SmoothingFunction()\n",
      "  warnings.warn(_msg)\n",
      "11it [00:00, 34.74it/s]/usr/local/lib/python3.10/site-packages/nltk/translate/bleu_score.py:577: UserWarning: \n",
      "The hypothesis contains 0 counts of 3-gram overlaps.\n",
      "Therefore the BLEU score evaluates to 0, independently of\n",
      "how many N-gram overlaps of lower order it contains.\n",
      "Consider using lower n-gram order or use SmoothingFunction()\n",
      "  warnings.warn(_msg)\n",
      "22it [00:00, 57.60it/s]/usr/local/lib/python3.10/site-packages/nltk/translate/bleu_score.py:577: UserWarning: \n",
      "The hypothesis contains 0 counts of 2-gram overlaps.\n",
      "Therefore the BLEU score evaluates to 0, independently of\n",
      "how many N-gram overlaps of lower order it contains.\n",
      "Consider using lower n-gram order or use SmoothingFunction()\n",
      "  warnings.warn(_msg)\n",
      "966it [00:10, 95.42it/s] "
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "testing loss: 3.3171152433006412\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "0.6083579034234977"
      ]
     },
     "execution_count": 62,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from nltk.translate.bleu_score import sentence_bleu\n",
    "# load checkpoints\n",
    "model = TransformerModel(config)\n",
    "model.load_state_dict(state_dict)\n",
    "\n",
    "loss_fct = CrossEntropyWithPadding(config)\n",
    "# from dataset import LangPairDataset\n",
    "test_ds = LangPairDataset(\"test\", max_length=128, data_dir=\"./wmt16\")\n",
    "test_dl = DataLoader(test_ds, batch_size=1, collate_fn=partial(collate_fct, tokenizer=tokenizer))\n",
    "\n",
    "model = model.to(device)\n",
    "model.eval()\n",
    "collect = {}\n",
    "loss_collect = []\n",
    "\n",
    "predictions = []\n",
    "answers = []\n",
    "# 初始化BLEU分数列表\n",
    "bleu_scores = []\n",
    "for idx, batch in tqdm(enumerate(test_dl)):\n",
    "    encoder_inputs = batch[\"encoder_inputs\"]\n",
    "    encoder_inputs_mask = batch[\"encoder_inputs_mask\"]\n",
    "    decoder_inputs = batch[\"decoder_inputs\"]\n",
    "    decoder_labels = batch[\"decoder_labels\"]\n",
    "    # print(decoder_labels.cpu())\n",
    "    # decoder_labels1=tokenizer.decode(decoder_labels.cpu().numpy())\n",
    "    # print(decoder_labels1)\n",
    "    # 前向计算\n",
    "    outputs = model(\n",
    "        encoder_inputs=encoder_inputs,\n",
    "        decoder_inputs=decoder_inputs,\n",
    "        encoder_inputs_mask=encoder_inputs_mask\n",
    "        )\n",
    "    loss = loss_fct(outputs.logits, decoder_labels)         # 测试集损失\n",
    "\n",
    "    # print(outputs.logits.shape, decoder_labels.shape)\n",
    "\n",
    "    # loss = loss_fct(outputs.logits[:, :decoder_labels.shape[1]], decoder_labels)         # 测试集损失\n",
    "    # outputs = model.infer(encoder_inputs=encoder_inputs)\n",
    "    # print(outputs.logits.shape)\n",
    "    preds = outputs.logits.argmax(dim=-1) # 预测结果，[1,seq_len]\n",
    "    # print(preds.shape)\n",
    "    #把preds转为英文单词\n",
    "    preds = tokenizer.decode(preds.cpu().numpy()) #['预测句子']\n",
    "    # predictions.append(preds)\n",
    "    # print(preds)\n",
    "    #把decoder_labels转为英文单词\n",
    "    decoder_labels = tokenizer.decode(decoder_labels.cpu().numpy()) #['标签句子']\n",
    "    # answers.append(decoder_labels)\n",
    "    # print(decoder_labels)\n",
    "    belu=sentence_bleu([decoder_labels[0].split()],preds[0].split(),weights=(1, 0, 0, 0))\n",
    "    bleu_scores.append(belu)\n",
    "    collect[idx] = {\"loss\": loss.item(), \"src_inputs\": encoder_inputs, \"trg_inputs\": decoder_inputs, \"mask\": encoder_inputs_mask, \"trg_labels\": decoder_labels, \"preds\": preds}\n",
    "    loss_collect.append(loss.item())\n",
    "    # break\n",
    "\n",
    "# sort collect by value\n",
    "collect = sorted(collect.items(), key=lambda x: x[1][\"loss\"])\n",
    "print(f\"testing loss: {np.array(loss_collect).mean()}\")\n",
    "sum(bleu_scores) / len(bleu_scores)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-05-06T13:16:14.099749Z",
     "start_time": "2024-05-06T13:16:13.991811900Z"
    },
    "ExecutionIndicator": {
     "show": true
    },
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 535,
     "referenced_widgets": [
      "40f7e3754ad44b33acfe0a80b3648a3a",
      "b1e51beac50f4947a9dd235d8aa87603",
      "8cd9e9702e114ebc856f56975544ede8",
      "b7c7a718a8654956947108969557ca83",
      "20a27d1ec76f4d85b1ffe99401fbb5b7",
      "e0ddf3970b3e4248bc87d4649fa9c448",
      "d7bdde54e2534c49a207540bd258d3ae",
      "22484000400842f0b6e245dc610acbba",
      "a66a5b4ff37d4dafa4ba3081aa1359f4",
      "0b7866c29e5f4afe9b92de15f1b88c3e",
      "333e84a304184c57af1821620ae80f6a"
     ]
    },
    "execution": {
     "iopub.execute_input": "2025-02-07T02:43:16.322887Z",
     "iopub.status.busy": "2025-02-07T02:43:16.322365Z",
     "iopub.status.idle": "2025-02-07T02:43:18.513140Z",
     "shell.execute_reply": "2025-02-07T02:43:18.512590Z",
     "shell.execute_reply.started": "2025-02-07T02:43:16.322862Z"
    },
    "id": "KGSym4CbN4ya",
    "outputId": "f5e9c4c2-c92e-44e6-c83a-5cb720305428",
    "tags": []
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Loading vocabulary from ./wmt16/vocab ...\n",
      "Read 762259 words (18107 unique) from vocabulary file.\n",
      "Loading codes from ./wmt16/bpe.10000 ...\n",
      "Read 20001 codes from the codes file.\n",
      " 12%|█▏        | 15/128 [00:00<00:02, 43.24it/s]\n",
      "/usr/local/lib/python3.10/site-packages/IPython/core/pylabtools.py:170: UserWarning: There are no gridspecs with layoutgrids. Possibly did not call parent GridSpec with the \"figure\" keyword\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAxoAAAHVCAYAAAB2YY0aAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAYBZJREFUeJzt3Xl4FFXe9vG7s3UICUkIS1gCYYewiiiLIlFRBGVE5kFFRVHEcUOBwZGgoAgSHxUh6OiMoIIOAu74KiPIpkJYRAHBMIRFDI4sEiABAlnP+wemHyNr0nU66fj9XFddkO7qu05XJXX617UclzHGCAAAAAAcFFDeDQAAAABQ+VBoAAAAAHAchQYAAAAAx1FoAAAAAHAchQYAAAAAx1FoAAAAAHAchQYAAAAAx1FoAAAAAHAchQYAAAAAx1FoAAAAAHAchQYAAAAAx1FoAAAAAHBcUHk3AAAAoLIqKirS9u3btX//fhUVFZV47rLLLvMqe8mSJVqyZMlps19//XWvsgEnUGgAAABYsHr1at1yyy368ccfZYwp8ZzL5VJhYWGZs8ePH6+nnnpKnTp1Up06deRyubxtLuA4l/n9bz4AAAC81qFDBzVv3lzjx48/bTEQGRlZ5uw6dero2Wef1aBBg7xtJmANhQYAAIAFVatW1caNG9W0aVPHs2NiYrR27Vo1adLE8WzAKVwMDgAAYEHnzp21fft2K9l333233n77bSvZgFO4RgMAAMCCYcOG6a9//av27t2rtm3bKjg4uMTz7dq1K3P2iRMn9Oqrr2rx4sVq167dKdkvvPBCmbMBp3DqFAAAgAUBAaeeOOJyuWSM8fpi8Msvv/yMz7lcLi1durTM2YBTKDQAAMAfTmZmpsaNG6dly5ad9vawBw8e9HoZP/7441mfb9iwodfLwOn5Yvvi3Dh1CgAA/OEMGjRI27dv15AhQ1S7dm0rt4f1RSGxfft27dixQ5dddpmqVKniOVryR+eL7Ytz44gGAAD4w4mIiNCKFSvUvn17q8t566239I9//EM//PCDVq1apYYNG2rq1Klq1KiRrr/++jLnZmZm6sYbb9SyZcvkcrm0bds2NW7cWHfddZeio6M1efJkB9+F//HV9sXZcdcpAADwh9OyZUsdP37c6jJeeeUVjRw5Un369NHhw4c912RERUVp6tSpXmWPGDFCwcHBysjIUFhYmOfxm266SZ999plX2ZWBL7Yvzo0jGpI6duxYqvldLpc+/vhj1atXz1KL/tg4DAz4j++++67Ur0lISFBQ0PmduWs7v7LxdX+2bdu2M54DP27cuDJl+srXX3+t0aNHa9y4cWrTps0pd22qVq2a18tISEjQpEmT1K9fP0VERGjjxo1q3LixNm/erMTERB04cKDM2bGxsVq4cKHat29fInvnzp1q166djh496nX7/Zkvtq8/8vU+9Y+5J/6dDRs26K9//avCw8PPOa8xRs8884xyc3N90LI/lszMTN10001aunRpicPAQ4YM4TAwUEF16NDBcxed8xEQEKD09HQ1bty4QuRXNr7sz6ZPn6777rtPNWrUUGxsbIkvhFwuV4UvNKKiopSdna0rrriixONO3BGq2A8//KALLrjglMfdbreOHTvmVfaxY8dKHMkodvDgQbndbq+yKwNfbF9/5Ot9KoXGrx555BHVqlXrvOblA68dI0aMUFBQkDIyMtSqVSvP4zfddJNGjhzJeregf//+5z3vBx98YLEl8Gdr1qxRzZo1zzmfMUZt2rSpcPmVja/6s4kTJ+rpp5/Wo48+WuaM8nTrrbcqODhYb7/9trWLhRs1aqQNGzacclH4Z599VqKfK4vu3bvrzTff1IQJEySdLO6Kior07LPPnvXWt38Uvti+/sqX+1QKDZ38xuF8VnixtLQ01a1b12KL/pgWLVqkhQsXqn79+iUeb9as2TlvEYiyiYyMLO8mwM/16NFDTZs2VVRU1HnNX3xKZEXJr2x82Z8dOnRIAwYMKNNrK4LNmzdr/fr1atGihbVljBw5Ug888IBOnDghY4zWrl2rOXPmKDk5WTNmzPAq+9lnn9WVV16pdevWKS8vT3/729/0/fff6+DBg1q5cqVD78B/+WL7+iNf71O5RgMVRkREhL799ls1a9asxPmm69atU69evZSZmVneTQQA/GrIkCG66KKLdO+995Z3U8rksssu07hx49SzZ0+ry5k9e7aefPJJ7dixQ5JUt25djR8/XkOGDPE6OysrSy+99JI2btyoo0ePqmPHjnrggQdUp04dr7P9na+2L86OQuNXBw4c0LFjx0oc3vz+++/1/PPP69ixY+rXr59uueWWcmxh5denTx9deOGFmjBhgiIiIvTdd9+pYcOGuvnmm1VUVKT33nuvvJsIoBQKCgp04sSJ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N7HSS0hI0KRJk9SvX78Sg1Zu3rxZiYmJOnDgQHk3EfDw9z4tISFBycnJuv7660v8vb344ot64403HLml96xZs876/B133OH1Mnyl+OOiv2xrX2xfnBunTv1GQUGBpkyZojlz5ig9PV2S1Lx5c91yyy16+OGHTxnspbRWrFihZcuW6d///rdat259St4HH3zgVb6/e+ONN3yynHXr1p3xOoQ/8jaoX7++9uzZowYNGqhJkyZatGiROnbsqK+//lput9ux5bD+z+yHH37w3AXkt9xut44dO1YOLSq97777rsT+0+lBsWznVxa2+zPJ//u0kSNH6oEHHtCJEydkjNHatWs1Z84cJScna8aMGY4sw58KiTN588039dxzz3nuQNS8eXM98sgjFf52/77YvgUFBVq+fLl27NihW265RREREfr5559VrVo1vxlI1PY+lULjV8ePH9dVV12lVatWqWfPnrrsssskSVu2bNGjjz6qjz/+WIsWLfLqouSoqCjdcMMNTjW5Uujfv79mzpypatWqqX///med14lOa+7cubr99tvVq1cvLVq0SFdffbXS09O1b9++P/y2ueGGG7RkyRJ17txZw4YN02233abXXntNGRkZGjFihCPLYP2fXaNGjbRhw4YSIzpLJ+8006pVq3Jq1fkpvrNRWlpaiW8+W7durddee00XXXRRhc6vTHzRn0n+36fdfffdqlKlih5//HHl5OTolltuUd26dZWSkqKbb765zLnZ2dmeI/PZ2dlnnbe0R/CnTZume+65R6GhoZ4Lts/EiZHZX3jhBY0dO1YPPvigLrnkEkknC8x7771XBw4cKHXfMHLkSE2YMEFVq1bVl19+qW7duikoyM5HUVvbt9iPP/6oa665RhkZGcrNzdVVV12liIgI/e///q9yc3Mr/DUsPtunOnICViUwbtw406BBA7Nx48ZTntuwYYNp0KCBeeKJJ3zfsEpu8ODBJjs72/P/s01OaNu2rXnppZeMMf93zmZRUZEZOnSoGTdunCPLqCxSU1PN5MmTzccff+xYJuv/7KZPn27q1atn5s6da6pWrWrmzJljJk6c6Pl/RfX999+b8PBwc9FFF5m3337brF+/3qxfv97Mnj3bdOrUyURERJjvv/++wuZXNvRnpXfs2DGzb98+R7ICAgI8WcXXS/x+Kut1FPHx8ebAgQOe/59patSokSPvJT4+3syaNeuUx2fOnGni4+NLnRcUFGT27t1rjCm5nmxzcvsWu/76681tt91mcnNzS1wDsmzZMtO0aVNHl+U0X+5TuUbjVy1atNCkSZP05z//+bTPv/vuu3rsscc8h5fgn6pWrarvv/9e8fHxiomJ0fLly9W2bVtt2bJFV1xxhfbs2VPeTazUWP/nNnv2bD355JPasWOHJKlu3boaP358iXEQKpobb7xRBQUFev/990876nv//v0VHBysd955p0LmVzb0Z+Xriy++0CWXXKKgoCB98cUXZ53Xibt/2RQaGqrNmzeradOmJR7ftm2b2rZtqxMnTpQqr1mzZrrxxht19dVX6/LLL9eHH35Y4o5ov1V8JK6iiomJUWpqqlq0aFHiGpBdu3YpISFBOTk55d3EM/LlPpVTp371448/ega7OZ0uXbooIyPD6+W89957Zzw/nQuT7IuOjtaRI0cknbyP9ObNm9W2bVsdPny4Qu8UfOXnn3/WihUrTjv4lhOH4Vn/Z5edna1bb71Vt956q3JycnT06FHPAJbbt28/pbOvKIrP0z/dRaIul0tjxozx6haotvMrG1/1Z5J/92n79u3TqFGjPAMO/v5717IOEvvb4sEXhUReXp5++OEHNWnSxPHTkJo2bap33nlHY8aMKfH4vHnz1KxZs1LnPffcc7r33nuVnJwsl8t1xlPvXC6X14P02tq+xYqKik6b8dNPPykiIsKrbNt8uU+l0PhVtWrVtH///jMOYrR3716vf3GmTZumxx57TIMHD9b8+fN15513aseOHfr666/1wAMPeJVdGdjeKUgnvyH5/PPP1bZtWw0YMEAPP/ywli5dqs8//1xXXnml1/n+bObMmfrLX/6ikJAQxcTElNgBuVwuRwoN1v/ZXXvttVq8eLHcbrfCwsI8Y8ps3bpVV155pX766adybuHpHTlyRLVr1z7j87GxsZ4CsyLmVza+6M8k/+/TBg8erIyMDI0dO1Z16tSxdjelr776Sv/85z+1c+dOvfvuu6pXr57eeustNWrUqMRAe6WVk5OjYcOGee5slZ6ersaNG2vYsGGqV6+eRo8e7XXbx48fr5tuuklffvml5xqNlStXasmSJWX6trtfv37q16+fjh49qmrVqmnr1q2eL1OcZnv7Xn311Zo6dapeffVVSSf7yaNHj+qJJ56o8F98+HSf6sgJWJXAjTfeaPr373/G5/v3728GDBjg1TJatGhh3n77bWNMyXs6jx071jzwwANeZVcG11xzjUlISDAvv/yy+fDDD81HH31UYnJCZmam+e9//2uMMaawsNAkJyebvn37mpEjR/rtvcKdUr9+fTNx4kRTWFhobRms/7O75pprTO/evU1+fr7nsbS0NBMbG2seeuihcmzZ2TVv3ty89957Z3z+3XffNc2bN6+w+ZWNL/ozY/y/TwsPDzfr16+3uoz33nvPVKlSxdx9993G7XZ71tGLL75oevfu7VX2Qw89ZC688ELz1VdfmapVq3qyP/roI9OhQwev215s3bp15tZbbzUdO3Y0HTt2NLfeeqv59ttvvc5dvnx5iX2d02xv3927d5uEhATTqlUrExQUZLp06WJiYmJMixYtfHbtSVn5cp9KofGr4gtjOnfubObNm2c2btxoNmzYYObMmWMuvvhiEx4ebjZv3uzVMqpUqeIZPKZmzZpmw4YNxpiTg8dUr17d6/fg73yx0/eF3Nxcs3v3bvPjjz+WmCq66tWrewbpQ/nIyckx3bp1MzfeeKMpKioymzZtMrVq1TIjRowo76adVfHFx5s2bTrlue+++840bNjQjB07tsLmVza+6M+M8f8+rVWrVo58YD6bDh06eC6m/m0x9u2335ratWt7ld2gQQOzatWqU7K3bdtmIiIivMr2hd/3kU73mb7Yvvn5+eatt94yjzzyiLnvvvvM9OnTTU5OjtVlOsGX+1ROnfpVQkKCPv/8cw0ZMkQ333yz5xCbMUYtW7bUokWL1Lp1a6+WERsbq4MHD6phw4Zq0KCBVq9erfbt2+uHH3445TShP6K4uDifrIfCwkJ99NFH2rJliySpdevW+tOf/qTAwECvcrdt26a77rpLqampJR43xjhyvqltQ4YM0bvvvuvI4fazsbX+K4MqVaro008/VWJiom688UZ9+eWXuv322/Xcc8+Vd9POKikpSYsXL1aHDh101VVXqVWrVjLGaMuWLVq8eLEuvvjiU87xrkj5lY0v+jPJ//u0qVOnavTo0frnP/+p+Ph4K8vYunXraS9qjoyM1OHDh73K/uWXX0572tGxY8ccPU3I1j47Pj7+rO30ts/0xfYNCgrSbbfdZiXbJp/uUx0pVyqZ9evXm3nz5pl58+Y5+g37kCFDzJNPPmmMMeall14yVapUMT179jRRUVHmrrvucmw5/mrhwoXm6quvNj/88IO1ZWzbts00b97chIWFmQsuuMBccMEFJiwszLRo0cLrb/O7detmLrvsMrNgwQKzfv16s2HDhhJTRVdQUGCuueYa06NHD/Pggw+aESNGlJicYHP9+6usrKxTpv/85z8mLi7O3HfffSUer8hyc3PNM888Y9q3b2+qVKliqlSpYtq3b2+Sk5PNiRMnKnx+ZWWrPzPG//u0qKgoExISYgICAkx4eLiJjo4uMTmhUaNG5vPPPzfGlDzqMGvWLNOqVSuvsrt3726mTZvmyd65c6cxxpgHH3zQ9OrVy6vsYjb32b/vI7/++mvz6quvmpYtW5r333/f67b7Yvu++eab5pJLLjF16tTxHN174YUXHDvd2yZf7VO5ve055OXlKS8vz5ERHouKilRUVOS5K8S8efO0cuVKNWvWTPfee68jI7X6m+jo6BLfaBw7dkwFBQUKCws7ZX0cPHjQ6+X16dNHxhjNnj1b1atXlyRlZmbqtttuU0BAgD799NMyZ1etWlXffPONWrZs6XU7y8PEiRM1btw4tWjRQrVr1z7lYvClS5d6vQyb699fBQQEnPZbPfObAZSMnxwVQ8XmZH8m+X+fVnwR9Zk4Map3cnKy/vWvf+n111/XVVddpQULFujHH3/UiBEjNHbsWA0bNqzM2StWrFDv3r112223eW7mkZaWptTUVH3xxRe68MILvW5/eeyzP/30Uz333HNavny5Vzm2t+8rr7yicePGafjw4Zo4caK+//57NW7cWDNnztSsWbO0bNkyr/IrCwqN33jjjTf07bffqkuXLrr11ls1ZswYTZ48WQUFBbriiis0d+5cxcTEeLWMEydO6Lvvvjvl9qEul0t9+/b19i34nXPtCH7LiZ1+1apVtXr1arVt27bE4xs3btQll1yio0ePljn7oosu0pQpU7y6i0h5io6O1pQpUzR48GBry7C5/v3Vue6z/1sV9Z77a9eu1YUXXnjGUylyc3M1f/583XjjjRUyvzLyRX8m0aedizFGkyZNUnJysucW3m63W6NGjdKECRO8zt+5c6eSk5O1ceNGHT16VB07dtSjjz56yj62rMpjn719+3a1b99ex44dczzbSQkJCZo0aZL69etXYhyNzZs3KzExUQcOHCjvJp6RT/epjh0b8XMTJ070HPatXr26uffee01sbKx55plnzLPPPmvq169v7r33Xq+W8e9//9vUqFHDuFyuU6ayjBBa2QwaNMi89tprVk+hiY6ONitXrjzl8RUrVnh9KHXJkiWma9euZtmyZebAgQOnnA5T0dWuXdukp6dbXYbN9Y/y8/sRfiMiIjyniBhjzN69e73ax9nOr2x80Z8Z45992m/3xac7bdHWPjs3N9d8//33Zs2aNebIkSOOZA4aNMi8/vrrfttn/n59Hz582GzZssXcdNNNpn379mXOPFO+09s3NDTUc7rUb0+LS09PN6GhoV7n2+TLfSoXg/9q5syZeu211zRw4ECtW7dOnTt31jvvvOMZWbVNmza69957vVrGsGHDdOONN2rcuHFnvX+xt7Zt26Zly5addtC1cePGWVuut9xut5555hkNHTpUdevWVY8ePZSYmKgePXqUaWCg07nuuut0zz336LXXXvMMaLVmzRrde++9+tOf/uRVds+ePSVJV1xxRYlTYYyfnPby8MMP68UXX9S0adOsLcPm+i/mr7//v5WTk3PaAdDatWtXTi06O/O7A+O///lMj1WU/MrGF/2Z5Js+zem/5+joaO3Zs0e1atVSVFTUGU9bdHqfHRISooSEBMfyijOTk5N19913+2Wfebr1b4xRXFyc5s6dW6ZMX27fRo0aacOGDWrYsGGJxz/77DO1atXKq2zbfLlPpdD4VUZGhueUl06dOikoKEht2rTxPN+uXTvt2bPHq2Xs27dPI0eOtFpkTJ8+Xffdd59q1Kih2NjYU86zr8gftKZPny5J+u9//6svv/xSX3zxhSZPnqy//OUvqlOnjiODlU2bNk133HGHunbt6jl/OD8/X9dff71SUlK8yvb38zHXrl2rpUuX6pNPPlHr1q1POb/6gw8+8HoZNte/5N+//9LJu8jceeed+ve//33a5yt6sXo2tgZD81W+P/FFfybZ79Ns/D0vXbrUc62BrX12//79z3teb/arM2bMkFR5+syAgADVrFlTTZs2LfMI577YvsVGjhypBx54QCdOnJAxRmvXrtWcOXOUnJzs2Tb+zKl9KoXGr/Lz8+V2uz0/h4SElPigFRQU5HUn/z//8z9avny5mjRp4lXO2UycOFFPP/20Hn30UWvLSEtLO+23rU59Ix0dHa2YmBhFR0crKipKQUFBqlmzpiPZUVFRmj9/vrZv3660tDRJJ8+zbNq0qdfZPXr00OHDh/Xaa695bgOYkJCgIUOGKDIy0uv8YrbWf1RUVKk6yLIuw9b6l3zz+y/Z2wbDhw/X4cOHtWbNGiUmJurDDz/Uvn37NHHiRE2ePNmrbPxx+KI/k+z3aTb+nn97nVOPHj08o3bv2LFD7733XolRu8vqfPf3Tn2Q8+c+Uyq5Pz106JDS09MllW1/6ovtW+zuu+9WlSpV9PjjjysnJ0e33HKL6tWrp5SUFN18881e51cWFBq/kZaWpr1790o6ecjoP//5j+dCJycu6nnppZc0YMAAffXVV2rbtu0p3xg/9NBDXi/j0KFDGjBggNc5p7Nz507dcMMN2rRpk+dOONL/7Sy97bjGjBmj5cuXa/369WrVqpV69Oih0aNH67LLLlN0dLTX7S/22muvacqUKdq2bZskqVmzZho+fLjuvvtur3LXrVuna665RqGhoZ5DzFOmTNGkSZO0aNEidezY0at82+v/5ZdfVlFRkapWrSpJ2rVrlz766CO1atVKvXr18ir7t2ytf8nu779kfxssXbpU8+fPV6dOnRQQEKCGDRvqqquuUrVq1ZScnKxrr73W6/dgi+39p+38ysYX68t2n2b77/n999/XoEGDdOutt2r9+vXKzc2VJGVlZWnSpElasGBBmXLfeOMNz//nzJmjgQMHnna+Rx55pEz5xfy9z9y5c6f69++v7777zsr+1Nb2LXb8+HHdcMMNuvXWW5WTk6PNmzdr5cqVql+/vle5vuKzfaojV3pUAsUXr53pojYnLm6bMWOGCQoKMuHh4aZhw4YmPj7eMzVq1MiR93HXXXeZV155xZGs37vuuuvM9ddfb3755RcTHh5u0tLSzFdffWUuvvhi8+WXX3qd73K5TK1atUxycrLZunWrAy0+1dixY03VqlXN6NGjzfz58838+fPN6NGjTXh4uNejYF566aVm8ODBJj8/3/NYfn6+ueOOO0z37t29bbr19X/VVVd5fncOHTpkateuberXr29CQ0PNyy+/7HW+MXbXvzF2f/+Nsb8NIiIiPOPINGjQwKxYscIYY8zOnTtNlSpVvM63xfb+0xf758rEV+vLdp9m++/Z5qjdxSIjI82CBQtOeXzEiBEmNjbWq2x/7zN/vz/9/vvvHd2f2t6+vugzbfHlPpVC41e7du06r8kbtWvXNk8//bQpLCx0qNWnmjRpkqlRo4a54447zPPPP29SUlJKTN6IiYkxGzduNMYYU61aNfOf//zHGHPybksdOnTwuu0bNmwwKSkp5oYbbjA1atQwdevWNQMHDjT//Oc/HduJ1qhRw7z99tunPP7222+bmJgYr7JDQ0PNli1bTnn8+++/d+RDou31HxMTYzZv3myMMWb69OmmXbt2prCw0LzzzjumZcuWXucbY3f9G2P3998Y+9ugU6dO5rPPPjPGGNO3b18zaNAg89NPP5m//e1vpnHjxl7n22J7/+mL/XNl4qv1ZbtPs/33XKVKFU9h/9sPojt27DBut9vrfGOM+eSTT0xkZKT56quvPI89+OCDpk6dOqftL0rD3/tM2/tT29vXF32mLb7cp1JoGGM2btxYqh3l5s2bS3xrfb6io6Otj37822+Ufj95+w1TVFSUZ+TRxo0bm6VLlxpjjNm+fbuVb1s3bNhg7rjjDhMUFORYZR0ZGXnaW7hu3brVREZGepVdq1Yts3DhwlMe/+yzz0ytWrW8yjbG/vqvUqWK+fHHH40xxgwYMMAz4m9GRoZj29fm+jfG7u+/Mfa3wVtvvWXeeOMNY4wx69at89w61O12m7lz53qdb4Pt/aev9s+VhS/Xl+0+zfbfs81Ru39r9uzZJjo62qxbt87cd999pm7dulaOQPhbn2l7f2p7+/qiz7TB1/tUCg1z8n7C+/fvP+/5f3+/4fM1fPhw8/TTT5f6dRXFpZdeaj788ENjjDEDBw4011xzjVmxYoW5/fbbTevWrb3OLyoqMt98842ZPHmy6du3r4mOjjaBgYHmggsuMMOHD/c635iT3ySNGDHilMf/+te/mvvvv9+r7GHDhpn69eubuXPnmoyMDJORkWHmzJlj6tevbx5++GGvso2xv/7btm1rUlJSTEZGhqlWrZpJTU01xpz8wOvUaQQ2178v2N4Gv3fs2DHzzTffmF9++cXxbKfY3n/6av9cWfhyffl7nzZp0iSTkJBgVq9ebSIiIsxXX31l/vWvf5maNWuaadOmObqsv//978btdpv69eubbdu2OZLp732m7f2p7e3riz7TBl/vU7kYXCcvghk7dqzCwsLOa/7f32nmfBUWFurZZ5/VwoUL1a5du1MunHvhhRfKlDty5EhNmDBBVatW1ciRI884n8vl8urONY8//rhnpM6nnnpK1113nbp3766YmBjNmzevzLnFqlevrqNHj6p9+/bq0aOHhg4dqu7duysqKsqr3N+uE5fLpRkzZmjRokXq0qWLpJP3BM/IyNDtt9/u1XKef/55uVwu3X777SooKJAkBQcH67777tMzzzzjVbZkf/2PGzdOt9xyi0aMGKErr7xSXbt2lSQtWrRIF1xwQZlzba9/X/3+S3a2wdna/Htl3UecS8+ePbVz507t3Lmz1K+1vf/01f65svDl+rLRp/ny73n06NEqKirSlVdeqZycHF122WWeUbuHDRtW5twztbtmzZrq2LGjXn75Zc9j3vxN+3ufabtPs7V9i9nqM89HRd5n/57LGEY5SkxMLPVt5t5++23VqVOnVK+5/PLLz/icy+XS0qVLS5X329wPP/xQUVFR1pZxJgcPHlR0dLQjt+n79NNP1b17d1WrVs2Blv2fs62T33Jq/eTk5GjHjh2SpCZNmpz3H3NZOLn+JWnv3r3as2eP2rdvr4CAAEknx9eoVq2aWrZsWaZM2+u/PH//Je+3ga9/P0/n73//uw4cOKAnnnii1K+1vf/01f65svDl+rLx91Yef895eXnavn27jh49qoSEBIWHh3uV56u/6crSZ/6W032a5Pz2/S0bfeb5qMj77N+j0AAAAADguIDybgAAAACAyodCAwAAAIDjKDTOIDc3V08++aRnJEnyya9oyyCffPLt/g1XJv6+Pcgnv6Ivg/zT4xqNM8jOzlZkZKSysrIcv9CK/Mqf74tlkE8++Xb/hisTf98e5JNf0ZdB/ulxRAMAAACA4yg0AAAAADjuDzNgX1FRkX7++WdFRESc1/2Ds7OzS/zrNPIrd74vlkE++eSff74xRkeOHFHdunU997v3Z/Rp5JNfsZbxR8s/333qH+YajZ9++klxcXHl3QwAQDnavXu36tevX97N8Bp9GoCK4Fz71D/MEY2IiAhJ0o/fxqtauJ1vs25o3tZKLgDAOwXK1wot8PQF/q74fSTcOlaBIaFWltFo4HYrucXS/18zq/m5Nex+j1oUaDVeQUedGx37dKJ2FlnNl6TgI3aXEXI4z2p+8MEcq/kqKLSbb/FYQkFRrr7Y9c9z7lP/MIVG8aHlauEBqhZhp9AIcgVbyQUAeOnX/vZ8TjPyB8XvIzAk1FqhEVw1xEpusUC3nXYXCwi1fMKG5UIjsMDu72pgsP1CI8jyMoKC7J4GGRRouxDw30Kj2Ln2qf5/oioAAACACodCAwAAAIDjKDQAAAAAOI5CAwAAAIDjKDQAAAAAOI5CAwAAAIDjKDQAAAAAOI5CAwAAAIDjHC80EhMTNWzYMA0fPlzR0dGqXbu2pk+frmPHjunOO+9URESEmjZtqn//+9+SpMLCQg0ZMkSNGjVSlSpV1KJFC6WkpJTIHDx4sPr166fnn39ederUUUxMjB544AHl5+efsR25ubnKzs4uMQEA4I/o0wD4IytHNGbNmqUaNWpo7dq1GjZsmO677z4NGDBA3bp107fffqurr75agwYNUk5OjoqKilS/fn29++67SktL07hx4zRmzBi98847JTKXLVumHTt2aNmyZZo1a5ZmzpypmTNnnrENycnJioyM9ExxcXE23ioAANbRpwHwRy5jnB2fPDExUYWFhfrqq68knTxiERkZqf79++vNN9+UJO3du1d16tTRqlWr1KVLl1MyHnzwQe3du1fvvfeepJNHNJYvX64dO3YoMDBQknTjjTcqICBAc+fOPW07cnNzlZub6/k5OztbcXFxOpTeWNUi7Jwx1qtuByu5AADvFJh8Ldd8ZWVlqVq1auXdnFI7U5/W9s6nFRgSamWZTW5Pt5Jb7D8ftrCaf6Kmox9vTlEUaDVewUddVvOjthVZzZekkCN2lxFyKM9qfnDmMav5Kii0m+/sR/wSCgpztWTntHPuU4NsLLxdu3ae/wcGBiomJkZt27b1PFa7dm1J0v79+yVJf//73/X6668rIyNDx48fV15enjp06FAis3Xr1p4iQ5Lq1KmjTZs2nbENbrdbbrfbibcDAEC5ok8D4I+sfLUfHBxc4meXy1XiMZfrZJVeVFSkuXPnatSoURoyZIgWLVqkDRs26M4771ReXt45M4uK7FfjAAAAAErPyhGN0li5cqW6deum+++/3/PYjh07yrFFAAAAALxV7re3bdasmdatW6eFCxcqPT1dY8eO1ddff13ezQIAAADghXIvNP7yl7+of//+uummm9S5c2dlZmaWOLoBAAAAwP84ftepiio7O1uRkZHcdQoA/oD8/a5Tv1fcp3HXqTPjrlNnx12nzo27Tp3Z+d51qtyPaAAAAACofCg0AAAAADiOQgMAAACA4yg0AAAAADiu3MfR8LV2y25TQBU7F86FPm4nt1jcxFSr+QAA/xJ8zCgw384FnxmvNLOSW6z64Xyr+Xn/tXu1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",
      "text/plain": [
       "<Figure size 1000x500 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/lib/python3.10/site-packages/IPython/core/pylabtools.py:170: UserWarning: There are no gridspecs with layoutgrids. Possibly did not call parent GridSpec with the \"figure\" keyword\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n"
     ]
    },
    {
     "data": {
      "image/png": "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3333qXr16kpMTPQ6QmhZVrkupOLj45WTk6MrrrjCa76/Tiu7/fbbdezYMbVu3Vrh4eGKjIz0ev58HIjg9yZPnqxatWpp0KBBXvPfeust/frrr3r00UeDlFnpmN6GKrqGDRtq06ZN+vrrr7Vt2zZJUtOmTdWjR49yfTZBmzZtznj66e85HA7t2LFDDRo0OKf1UUiVwiOPPFLsJq2n8/zzzxvOBqbEx8dr7969ql+/vtf89evXl9tfk4HyrjJdnF6ksvQJTz31lCZOnFjud3hL0r9/f4WFhWnWrFlGBgqYOnWqX+NVRq+99lqJPz42b95ct9xyS7nfrkxvQ5WBZVm6+uqrdfXVVwc7FZ+sXLlSNWrUOOtytm2X+YgzhdRZ7N69u1T/GUXS09OVlJRkMCOYUvTF///+3/+TZVlyu91aunSpRo4cqdtvvz3Y6QEVUkm/Dp76C3ZFujhdqlx9wv/+9z/dfPPNwU7jnHz33Xdav369LrroIiPxi0Zzxent27dPtWvXLja/Ro0a2rt3bxAy8o3pbagyWLhwoRYuXFjiqb9vvfVWkLI6s65du6phw4aKj48v1fKXX355sSPOvqCQOot69er5tHzReaSoeCZNmqQHHnhAycnJcrlcatasmVwul2699VY98cQTwU4PqJAq08XpUuXqE26++WbNnz9f9957b7BT8dkll1yirKwsozvBjOJ6ZsnJyVq6dGmxsziWLl1abn88OFUgtqGKLDU1VRMmTNAll1xSoQYH+vbbb31a/osvvijT+iikSuHAgQM6evSoVwe6ZcsWPffcczp69KhuvPFG3XrrrUHMEP4QHh6u6dOna9y4cdq8ebNyc3PVtm1bNWrUSMePHy/TLxbA+crXwqMiqCx9QsOGDTV27FitWLGixFMtH3744SBldnYPPfSQhgwZokceecTIaaKM4np2d999t4YOHaqCggLPdUYLFy7UqFGjNGLEiCBnd3amt6GK7p///KdmzJihAQMGBDsVvyksLNSJEydKdY1raTFqXyn069dPSUlJnnPd9+/fryZNmigpKUkXXnihvvzyS7355puVamM7Hz388MN68cUXi80/evSoevXq5fOvHAC8VfSL04tUlj7h90cSTmVZlnbt2hXAbHzjcDiKzfPnaaKM4np2tm1r9OjRevHFF5Wfny9JioiI0KOPPlquByopYnobqugSEhK0atUqXXjhhcFOxWf/+c9/dPDgQQ0cONAzb+LEifrb3/6mwsJCXXHFFXr//fdVtWrVMq+LQqoU6tevrxkzZqhr166SpOeee07//Oc/tW3bNoWGhuq5557T3LlztWLFiiBnirK48MILddtttyk1NdUz7+jRo7rmmmskSYsXLw5WakClkJKSolmzZqlTp05e81euXKlbbrmlwpwGSJ8QfD/88MMZny/rkdCYmBht3rxZ9evX9yqk9uzZoyZNmujEiRNlil+Z5ObmauvWrYqMjFSjRo3kdDqDnVKpmN6GKrpHH31UMTExGjt2bLBT8Vn37t315z//WQ888IAkadmyZerSpYsmTJigpk2b6vHHH9e1116rF154oczr4tS+Uti3b59SUlI8j7/55hv16dPHM+b8n/70J02ePDlI2cFf5s+fry5duqhq1aoaOnSojhw5op49eyo0NFRffvllsNMDKryKfnF6EfqE4DO9k8sorqUXExOjSy+9NNhp+Ox8L5TO5sSJE3r99de1YMECtWrVqtipj/4oQkzZsmWLV35z587VVVddpccff1zSySOnQ4YMoZAKlNjYWB0+fNjzoVu1apUGDx7sed6yrHJ7n5BTuVwuzZgx47QjsHzzzTdlin/48GGtWrWqxNgVYdS7Cy+8UPPmzVP37t3lcDg0e/ZsOZ1Off7554qOjg52eueFir4N4cwq+sXpRegTyod3331X//znP7V7924tX75c9erV09SpU1W/fn3dcMMNZYrNKK4l69OnT6mX/eijjwxm4h8mt6GKbtOmTWrTpo2kkyMcnqq8Dzxx5MgRJSQkeB4vWbLEa4TS5s2b6+eff/bLuiikSqFDhw568cUXNX36dH300Uc6cuSI1w3cTr3rc3k2ZMgQzZgxQ3/84x/VokULv34Q/vOf/6h///7Kzc1VbGxssRs7VpSOp1WrVvrss8901VVXqX379vrss88YZCJAKss2hNOr6BenF6FPCL5XX31V48aN09ChQzVx4kTP9Szx8fGaOnVqmXeCGcW1ZHFxcZ6/bdvWv//9b8XFxemSSy6RJK1du1aHDx/2qeAKFtPbUEVXka8Lr1OnjrZu3aq6desqNzdXGzdu1JQpUzzPHzx4UFFRUf5ZmY2z2rhxo129enU7PDzcdjgc9hNPPOH1/G233Wb/9a9/DVJ2pZeQkGB//vnnRmI3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7XYXe87tdts33nijffPNN/tlXVwjVQo//PCD5/zfknTo0EGZmZkBzOjczZ0797TXJ6xbt+6c495555265pprVLNmTa/5R44c0Z133lkh7gF09dVXa8yYMfrkk08898o4fPiwHnvsMV111VVljp+amqq77rpLaWlpnuuwVq5cqXnz5mn69Olljm9CIO8jURm2Idu2S7z+YePGjapWrVoQMiq9d955R6+//rquvPJK3XvvvZ75rVu31rZt2/yyjqpVq+rIkSOSTt7n47vvvlPLli11+PBhHTt2zC/rCIRA9Am//PKLRo4c6blZrv27s/D9daqrqT5BMvt5MN0+f/nLXzR79mzVrFlTKSkpxa4fK2vbSCdvUD19+nQ988wzXvPfeOONMt+HjO3n7Ey1UU5OjuyTByp05MgRr1N8XS6Xvvjii2L93LkYMGCAvv/+ew0ePNiv1/EVeemll3TixAlJ0uOPP66wsDAtW7ZMN910U7m/l1rRtZ8ltYllWXrsscf8dtouhVQpxMbGav/+/af9Ytu3b5+qVKkS4Kx89+KLL+rxxx/XwIED9cknn+jOO+9URkaGVq9erQceeKBMsU/3hffjjz963cCvPHvuued0+eWXq169ep4hUTds2KBatWrp3XffLXP8gQMHqmnTpnrxxRc9F3E3bdpUS5YsKTbARXnRtWtXSScvrJ80aZIGDRqkCy64wMi6KvI2VDQ6o2VZaty4sdf7cLlcys3N9SpOyqOffvqpxKGw3W63CgoK/LKOyy+/XF9//bVatmypm2++WUOGDNE333yjr7/+WldeeaVf1hEIgegTBg4cqMzMTI0dO1a1a9c2MqqeqT4hEJ8H0+1zxx13aO3atbrtttuM7KRK0pQpU3TTTTfpyy+/9PQBq1at0s6dO/Xhhx+WKbap9hk+fLj+9re/KTo6ukJvP5K5NioaUKQo/9+zLEupqallXs/ixYu1ZMkStW7dusyxfq+wsFCfffaZevbsKenk9cyjR4/2+3pMOXLkiGrVqnXa5xMTEz0/6pUVg02UQt++fVVYWHjaL7abbrpJISEh+uCDDwKcmW+aNGmiJ598Uv369VOVKlW0ceNGNWjQQOPGjdOhQ4f00ksv+Ryzbdu2sixLGzduVPPmzRUa+n+1ucvl0u7du3XNNdeU+7YpcvToUb333nvauHGjIiMj1apVK/Xr169CjMBlWpUqVbR582alpKT4NW5l2IZmzpwp27Y1aNAgTZ061avwCw8PV0pKiudi8vLq4osv1rBhw3Tbbbd5fT9MmDBBX3/9tRYvXlzmdRw6dEgnTpxQUlKS3G63nnnmGS1btkyNGjXSE088oapVq/rhnZgXiD6hSpUqWrx4sdq0aXPOMc7GRJ8gBebzYLp9oqOj9dVXX6lz585G4hf58ccf9corr3iO+jZt2lT33ntvmY9ImWqf7t2769///rfi4+Mr9PYjmWujRYsWybZtXXHFFfrwww+9jp6Fh4erXr16SkpKKvN6Lr30Uv3jH/9Qhw4dyhyrJFFRUdq6dWux4eErgosuukiTJk3STTfdVOLzc+fO1eOPP67t27eXeV0ckSqFJ598Uu3bt1eHDh00fPhwNWnSRLZta+vWrZoyZYrS09O1YsWKYKd5VpmZmerUqZOkk2PsF1XjAwYMUIcOHc7pS6/ohrYbNmxQz549FRMT43mu6AvvdBtyeRQdHa177rnHWHy3263vv/++xPuSXH755cbW6w9XXHGFFi1a5PdCqjJsQ0Wja9WvX1+dOnUyWnjn5+eXuP2U9aah48aN0x133KGffvpJbrdbH330kbZv36533nlHn332WZliFzl1h6Ki/cJ5qkD0CcnJycVONfI3E32CFJjPg+n2SU5ODsh9nC644AJNmjTJ73FNtc+pp3tX5O1HMtdGRWdy7N69W3Xr1jV2j7ZXXnlFo0eP1rhx49SiRYti7VTW7bddu3Yl3merIrjllls0fPhwXXTRRWrRooXXc5s3b9bIkSP9drkAhVQpNGvWTF9//bUGDx6sW265xfOhsG1bTZo00fz589W8efMgZ3l2iYmJOnTokOrVq6e6detqxYoVat26tXbv3n3OXyZFN7RNSUlR3759y/1wv2dyppu3SSrzh27FihW69dZb9cMPPxRr74owvPe1116r0aNHa/Pmzbr44osVHR3t9fy53uepMm1DRR2odHII8d9fM1CWjm3nzp0aNGiQli1b5jW/6JTIsm4/N9xwg/7zn/9owoQJio6O1rhx4/SHP/xB//nPf/xyjWCRjIwMvf3228rIyNC0adNUs2ZNffnll6pbt26F+B6VAtMnTJ06VaNHj9Zrr73m9x8vipjoE3Jycjzbedu2bXX8+HEdP368xGXL8nkw3T7PP/+8Ro0apX/+85/G2l86eR3uqlWrSvxxpCx9jqn2adCggVavXq2EhATVqlWrwm4/kvlt6IcfftAPP/xw2ufL+uNpfHy8cnJydMUVV3jN91efcP/992v48OHKysoqsc/39/2Y/GnMmDFasGCB2rRpo6uuukpNmzb1/Ni1YMECtWvXTo899phf1sWpfT7asGGD1429TJ524W933XWXkpOT9eSTT+rll1/WI488ossuu0xr1qxRnz599OabbwY7xaD6/WlFBQUFOnbsmMLDwxUVFaVDhw6VKX6bNm3UuHFjpaamlng+dnm/DuhM93yqCIVgIBw7dkyjRo3SBx98oIMHDxZ7vixtdNlllyk0NFSjR48ucfsxcZ68vy1atEjXXnutLrvsMv33v//V1q1b1aBBAz399NNas2aN5s6dG+wUfWaqT6hataqOHTumwsJCRUVFFfu1uazfR5KZPiEkJER79+5VzZo15XA4Svw13h87eqbbJxDt/5///Ef9+/dXbm6uYmNjvdrKsqwyrcNU/tOmTdNf//pXRUREaNCgQapfv77Gjh1b4bYfyfz/cUl95u+v9yqLdu3aKTQ0VEOGDCnxOr5Tf9g7F6fL31/tb1p+fn6JN02/5ZZbNGzYMDmdTr+sh0KqDPLz85Wfn+91KlJ55na75Xa7PdegvP/++1q6dKkaNWqke++91+fD59WqVdOOHTtUvXp1z8Whp+OPTicYdu7cqfvuu0+PPPKI56LLcxUdHa2NGzeWeEH/+aqybUMPPPCAvv32W/3tb3/TgAED9PLLL+unn37Sa6+9pqefflr9+/c/59jR0dFau3atmjRp4seMizN16qAkdezYUTfffLOGDx/udU3FqlWr1KdPH/34449lXkcw+bNPmDlz5hmf98fNWv3dJ0gni+Wiov/Um8+WpCw7eqbbJxDt37hxY1133XWaNGmSoqKiyhzvVIHIPz8/31OESBVr+5HMt1F2drbX44KCAq1fv15jx47VxIkTyzzATlRUlNavX6+LLrqoTHFO50xH0yRVyFP+TKCQKqW3335b69atU4cOHdS/f3899thjev7551VYWKgrrrhCc+bMUUJCQrDTPKsTJ05o06ZNxXaULMvS9ddf71OsmTNn6pZbbpHT6QzIl3awrFmzRrfddluZh4C+4oorNGrUKF1zzTV+yqziq2zbUN26dfXOO++oW7duio2N1bp169SwYUO9++67mj17tr744otzjn3ppZdqypQpxi5+N33qoCTFxMRo8+bNql+/vlchtWfPHjVp0sQz1G5FQJ9QtvjSuZ8OXFlER0dr8+bNatCgQbBTOWdsP75btGiRhg8frrVr15YpzuWXX65x48apR48efsrM23//+1916tTJawAo6eSIfsuWLSvX13WvWrVKF198sUJCQkp8Pi8vT5988on+8pe/lHldXCNVChMnTtTEiRN12WWXadasWVqyZIk+/vhjTZgwQQ6HQy+++KKeeOIJvfrqq8FO9YzmzZunAQMGlHjK0bnsKJ26Y7tw4UJ169ZNXbt21YUXXljmXMuT0NBQ/fzzz2WO89BDD2nEiBHat2+fWrZsWezXuvJ4vvGLL76oe+65RxEREXrxxRfPuOzDDz/sc/zKtg0dOnTIs1MUGxvrOYrWuXNn3XfffWWK/fe//12jRo3SpEmTStx+ynq9wMCBAxUaGqrPPvvM2HDb8fHx2rt3r+rXr+81f/369apTp47f12eKqT7h1OtDcnJyzrisPwZC8HefUFL822+/XQcOHPBLfNPtE+j279mzp9asWeO3QioY248//38DET/QbVSSWrVq+WW0uIceekhDhgzRI488YmSfonv37p7TLE+VnZ2t7t27l+tT+zp27OiVe2xsrDZs2OD5rB0+fFj9+vXzSyElv9zWt5Jr2LChPWvWLNu2bXv16tW2w+Hwuqv9F198YdetWzdY6ZVaw4YN7fvvv9/et2+f32PfdddddqNGjWyHw2FfcMEFdv/+/e3p06eXeNf28uqTTz7xmj7++GP71VdftZs3b25fc801ZY5vWdZpp/J6l/aUlBT7wIEDnr9PN9WvX7/M66oM21DLli3ttLQ027Zt+8orr7RHjBhh27ZtT5s2za5Tp06ZYv9+eyma/LX9REVF2Vu3bi1znDMZMWKE3blzZ3vv3r12lSpV7J07d9pLliyxGzRoYI8fP97ouv3JVJ/gcDjsX375xbZtu9j/s7//v4veh6k+wUR80+0T6PZ/44037Lp169pPPvmkPXfu3GJ9UHnPv6JtP7Yd2DbauHGj17Rhwwb7yy+/tLt27WpfdtllZY5vep/Csix7//79xeZv377drlKlSpnjm2RZluf/2bZtOyYmxs7IyPA83rdvn21Zln/WZduc2nc2TqdT33//vee+Dk6nU5s2bfKc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Ct/v5ebm+u2cftOfsUAIVJ+QmJio77//XikpKV7zlyxZ4rfhsk32Cabjm26fQLR/SWJjY5Wamqrrr79eAwYMOOc4bD9nZ7qNTPYHkvk+7dixY5748+fPV58+feRwONShQ4ezDnQRTIHcb5ckM1tnJdK2bdsS77FxOh07dlRmZuY5ratFixbauHGjJKl9+/Z65plntHTpUk2YMMEvH+o77rhD77//fpnjlMS2ba1bt04vvPCC/vSnP6l79+7617/+pZYtW5b5POYipttnwIABJd735fXXX1f//v3LHN90/qbj33DDDRo0aJD+/e9/68cff9SPP/6of//73xo8eLBuvPFGSSdvgte4ceNzim96GzLdPpJ01113adasWX6J9Xt9+/bV4MGD9f777ysrK0tZWVmaM2eO7rrrLvXr1++c4w4fPlzDhw/3XJNR9Hj48OEaMmSI+vbtqzZt2vjlPZj+jAVCoPqEu+++W0OGDNHKlStlWZZ+/vlnvffeexo5cmSZ70lWxGSfYDq+6fYJRPufTnZ2trKzs8sUg+3n7Ey3kcn+QDLfpzVs2FAff/yxsrKy9NVXX+nqq6+WJO3fv9/YPbb8IZD77RKDTZyVbdsaO3as52K7synLEOhPPPGEjh49KunkRai9evVSly5dlJCQ4JcvE5fLpWeeeUZfffWVWrVqVezCzRdeeOGcY1erVk25ublq3bq1unbtqrvvvltdunRRfHx8GbP+Pyba59SR6CzL0htvvKH58+erQ4cOkqSVK1cqMzNTt99+e7nMP5DxX3vtNQ0bNky33HKL5+hBaGio7rjjDk2ZMkWS1KRJE73xxhvnFN/0NmSqfU7dhtxut15//XUtWLDA75+x5557TpZl6fbbb/e0f1hYmO677z49/fTT5xx3/fr1kk5+123evFnh4eGe58LDw9W6dWuNHDnynOMH8jN2Oj169NCuXbu0a9euMscKVJ8wevRoud1uXXnllTp27Jguv/xyOZ1OjRw5Ug899NA5xfw9k32C6fim2ycQ7f/7m5zbtq29e/fq3Xff1bXXXlum2Gw/Z2eijQLVH0jm+/xx48bp1ltv1bBhw3TllVeqY8eOkk4enWrbtm2Z459JWb6zA7nfLkncR+osunXrVuLpLmcya9asMt9zqMihQ4dUtWpVn3MoSffu3U/7nGVZ+uabb8459ueff64uXboE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",
      "text/plain": [
       "<Figure size 1000x500 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/lib/python3.10/site-packages/IPython/core/pylabtools.py:170: UserWarning: There are no gridspecs with layoutgrids. Possibly did not call parent GridSpec with the \"figure\" keyword\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAxoAAAHiCAYAAABvHroPAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAflhJREFUeJzt3XdcU9f/P/DXDSMsGeIAFBkiCgKKtVrrAJXWUa2j1TrqwFFbrbPaaq3WTV111Nbdit1+1dYO6xaraFEciKKAKAVbrXWBoDKS8/vDD/mZAg5yb0Lg9Xw87kNyk7zPOzHJyTv3nnMkIYQAERERERGRjFSmToCIiIiIiCoeFhpERERERCQ7FhpERERERCQ7FhpERERERCQ7FhpERERERCQ7FhpERERERCQ7FhpERERERCQ7FhpERERERCQ7FhpERERERCQ7FhpERERERCQ7FhpERERERCQ7S1MnQERPJjs7u8T9kiRBrVbD2trayBkRERERlU4SQghTJ0FEj6dSqSBJUqnX165dG4MHD8aHH34IlYoHK4mIiMi0eESDyExs2LABU6dOxeDBg9GsWTMAwNGjRxEdHY0PPvgA//77LxYtWgS1Wo3333/fxNkSERFRZccjGkRmon379hgxYgR69+6tt3/Tpk1YvXo19u7diy+//BJz587F+fPnTZQlERFRyUo7Bbgkjo6OCmZCxsJCg8hM2Nra4vTp06hXr57e/tTUVDRq1Ah3797FpUuX0LBhQ9y9e9dEWRIREZXscacAP0yj0SicDRkDT50iMhOenp5Yv349PvroI73969evh6enJwDgxo0bcHFxMUV6REREj7R//37d3+np6Zg8eTIGDx6MFi1aAACOHDmC6OhoREVFmSpFkhmPaBCZiZ9++gm9evVCgwYN8OyzzwIA4uPjcf78eWzevBldunTBypUrkZqaio8//tjE2RIREZWuffv2GDZsGPr27au3/5tvvsGaNWsQExNjmsRIViw0iMzIpUuXsHr1aqSkpAAA6tevjxEjRsDb29u0iRERET0FOzs7JCQkFDsdOCUlBY0bN+YpwBUECw0ioicUHR2NatWq4aWXXgIAvPvuu1izZg0CAwPx7bffwsvLy8QZEhGZh/r166Nbt25YsGCB3v53330X27ZtQ3JysokyKzuNRoPExER4eXnxNOb/YaFBZEZu376No0eP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isaXqjgoGl9pUinDBORQqM3Dnr9XP/Yzr0Id0SAiIiIiovKBhQYREREREcmOhQYREREREcmOhQYREREREcmOhQYREREREcmuwizYV24IAYAzXZREZWujbANKL7RopdDMKP9T84cLisaX1NaKxtdc/UfR+ACg8qmuaHyr6zmKxr80/XlF49eZdVjR+ESyY59JBtDez1M0vtn/Gq/grFNC5D/R7cz+OSQiIiIiovKHhQYREREREcmOhQYREREREcmOhQYREREREcmOhQYREREREcmOhQYREREREcmu0hYa4eHhGDdunKnTICIiIiKqkCrtOhpbt26FlcLrIhARERERVVaVttCoWrWqqVMgIiIiIqqweOoUAG9vb8ybNw9DhgxBlSpVUKdOHaxZs8a0CRIRERERmbFKW2j81+LFi9G0aVOcPHkSI0eOxFtvvYXk5ORSb5+Xl4fs7Gy9jYiIiIpjn0lUObHQ+J/OnTtj5MiR8PPzw3vvvYdq1aph//79pd4+KioKTk5Ous3T09OI2RIREZkP9plElRMLjf8JCQnR/S1JEtzc3HDt2rVSbz9lyhRkZWXptszMTGOkSUREZHbYZxJVTpV2MPh//XcGKkmSoNVqS729Wq2GWq1WOi0iIiKzxz6TqHLiEQ0iIiIiIpIdCw0iIiIiIpIdCw0iIiIiIpJdpR2jERMTo/s7PT292PWnTp0yWi5ERERERBUNj2gQEREREZHsWGgQEREREZHsWGgQEREREZHsWGgQEREREZHsWGgQEREREZHsKu2sU4pRWQCShTKxtRpl4v6PZKnsy0F7966i8S2cnRWNr71zR9H4Ij9f0fgqb09F44vCQkXjA4D1qTRF42tzchWNX2eXraLxU1Y/q2h8/xHHFI1PlZAZ95lkeipbG2XjV3VRND60WmXjq5Q7niBp84DsJ0hBsQyIiIiIiKjSYqFBRERERESyY6FBRERERESyY6FBRERERESyY6FBRERERESyY6FBRERERESyY6FBRERERESyY6FBRERERESyY6FBRERERESyY6HxkB07dqBVq1ZwdnaGq6srunTpgrQ0ZVciJiIiIiKqiFhoPCQ3NxcTJkxAfHw89u7dC5VKhR49ekBbwhLxeXl5yM7O1tuIiIioOPaZRJWTpakTKE9eeeUVvcuff/45qlevjqSkJAQFBeldFxUVhZkzZxoz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REREJDsWGkREREREJDsWGkREREREJDsWGkREREREJDsWGkREREREJDsWGkREREREJDsWGkREREREJDsWGkREREREJDsWGkREREREJDsWGkREREREJDsF1yav2PLy8pCXl6e7nJ2dbcJsiIiIyi/2mUSVE49olFFUVBScnJx0m6enp6lTIiIiKpfYZxJVTiw0ymjKlCnIysrSbZmZmaZOiYiIqFxin0lUOfHUqTJSq9VQq9WmToOIiKjcY59JVDnxiAYREREREcmOhQYREREREcmOhUYpVqxYgfbt25s6DSIiIiIis8RCoxTXr19HWlqaqdMgIiIiIjJLLDRKMWPGDKSnp5s6DSIiIiIis8RCg4iIiIiIZMdCg4iIiIiIZMdCg4iIiIiIZMdCg4iIiIiIZMeVwYmelFajaHihcHxIkrLxhVA2PoDCq/8o3oaStHfuKBq/6hdHFI0vWVkrGr9Goo2i8SdfPKVY7Nw7WsSEKBa+wrJwqgILSZnXlbifp0hcXXyNVtH4koWyvwWLwkJF40tGWAle5VhF2QZslH0MwtJC0fiwUvBrviYPuPb4m/GIBhERERERyY6FBhERERERyY6FBhERERERyY6FBhERERERyY6FBhERERERyY6FBhERERERyY6FBhERERERya5cFRrh4eGQJAmSJOHUqVOVNgciIiIiInNXrgoNABg+fDiuXLmCoKAgpKen6770/3f7448/dPe5d+8ePvzwQ/j7+0OtVqNatWro1asXzp49qxf77t27mDJlCurWrQsbGxtUr14dYWFh2LZtm+42W7duxdGjR432eImIiIiIKqJytzK4nZ0d3Nzc9Pbt2bMHDRs21Nvn6uoKAMjLy0NERAQyMjKwePFiNG/eHP/88w+ioqLQvHlz7NmzB8899xwA4M0330RcXBw++eQTBAYG4saNGzh8+DBu3Lihi1u1alVkZ2cr/CiJiIiIiCq2cldolMTV1bVY8VFk6dKlOHLkCE6ePIlGjRoBALy8vLBlyxY0b94cQ4cOxZkzZyBJEn766ScsW7YMnTt3BgB4e3vjmWeeKVNOeXl5yMvL011mcUJERFQy9plElVO5O3XqaX3zzTd44YUXdEVGEZVKhfHjxyMpKQkJCQkAADc3N2zfvh137twxuN2oqCg4OTnpNk9PT4NjEhERVUTsM4kqJ7MoNJ5//nk4ODjobUVSUlIQEBBQ4v2K9qekpAAA1qxZg8OHD8PV1RXPPvssxo8fj9jY2DLlNGXKFGRlZem2zMzMMsUhIiKq6NhnElVOZnHq1Pfff19qMQEAQognitOmTRtcvHgRf/zxBw4fPoy9e/di2bJlmDlzJqZNm/ZUOanVaqjV6qe6DxERUWXEPpOocjKLIxqenp7w8/PT24r4+/vj3LlzJd6vaL+/v79un5WVFVq3bo333nsPu3btwqxZszB79mzk5+cr+yCIiIiIiCoRsyg0HqVPnz7Ys2ePbhxGEa1WiyVLliAwMLDY+I2HBQYGorCwEPfv31c6VSIiIiKiSsMsTp26ceMGrl69qrfP2dkZNjY2GD9+PLZt24auXbvqTW87b948nDt3Dnv27IEkSQAeLMbXt29fNG3aFK6urkhKSsL777+Ptm3bwtHR0RQPjYiIiIioQjKLQiMiIqLYvm+//RZ9+vSBjY0N9u3bh3nz5uH999/Hn3/+iSpVqqBt27b4448/EBQUpLtPhw4dEB0djffffx93796Fh4cHunTpgunTpxvz4RARERERVXjlutDw9vZ+ooHednZ2mDNnDubMmfPI202ZMgVTpkyRKz0iIiIiIipFuRuj8dlnn8HBwQGJiYkmab9Tp07FViEnIiIiIqKnU66OaHz99de4d+8eAKBOnTomyWHdunUmz4GIiIiIyNyVq0KjVq1apk6hXORARERERGTuylWhYc6KxpIUogB4svUDiYxMUjb8Ey6caRiFH4PCJKFVNL4QhYrGl4Syz79KKHs2b+4d5Z7/uzkPYj/pArKVna7PFMqtYSUUjP0gvrL/10q/34TQKBpf6fwBQKVVeA00ZT+yITQWyjagUu7/uFCTB+Dx7wNJ8FNRFpcvX4anp6ep0yAiIhPKzMxE7dq1TZ1Gucc+k6hieNxnHgsNmWi1Wvz999+oUqWKbt2OR8nOzoanpycyMzMVWcOD8St2fGO0wfiMz/hPHl8IgTt37sDDwwMqVbmbZ6XcYZ/J+MaMb4w2Klv8J/3M46lTMlGpVGX6FcvR0VHRxQIZv2LHN0YbjM/4jP9k8Z2cnBTLo6Jhn8n4pohvjDYqU/wn+czjzy5ERERERCQ7FhpERERERCQ7Fhomolar8eGHH0KtVjM+45fLNhif8Rlf2fcwPTlz//9mfNPGN0YbjF8yDgYnIiIiIiLZ8YgGERERERHJjoUGERERERHJjoUGERERERHJjoUGERERERHJjoUGERERERHJjoUGERERERHJjoUGERERERHJjoUGERERERHJ7v8BnXg+qw553LoAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 1000x500 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/lib/python3.10/site-packages/IPython/core/pylabtools.py:170: UserWarning: There are no gridspecs with layoutgrids. Possibly did not call parent GridSpec with the \"figure\" keyword\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAxcAAAHfCAYAAAAiBCXMAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAdXdJREFUeJzt3XdcFNf6P/DPLGUpS1FEwYJoBAMi2BK7oGJJYmK79tg1RZMYDVGxoyiJJWquKYpfsSSWJHqjN7ETMYotNiyoKIqQqDESBVGpe35/eNmfG1CBndll2c/79ZqX7OzsM88OMmefPXPOSEIIASIiIiIiIgOpTJ0AERERERFVDCwuiIiIiIhIFiwuiIiIiIhIFiwuiIiIiIhIFiwuiIiIiIhIFiwuiIiIiIhIFiwuiIiIiIhIFiwuiIiIiIhIFiwuiIiIiIhIFiwuiIiIiIhIFiwuiIiIiIhIFiwuiEgReXl5eOGFF3DhwgVTp0JERERGwuKCiBRhY2OD7OxsU6dBRERERsTigogUM3bsWHz66afIz883dSpERERkBJIQQpg6CSKqmHr27InY2FhoNBo0bNgQjo6Oes9v2bLFRJkRERGREqxNnQARVVyurq7o3bu3qdMgIiIiI2HPBRERERERyYJjLohIUfn5+di7dy+WL1+O+/fvAwBu3LiBrKwsE2dGREREcmPPBREp5vr16+jatStSU1ORk5ODpKQk1K1bF+PGjUNOTg6+/vprU6docvn5+YiLi0NycjIGDhwIJycn3LhxA87OztBoNKZOj4iIqFTYc0FEihk3bhyaNWuGu3fvwt7eXre+cKC3pbt+/ToaNmyI7t27Y+zYsfjrr78AAJ9++inCwsJMnB0REVHpsbggIsUcOHAA06ZNg62trd56b29v/PHHHybKqvxg8UVERBUNZ4siMlBsbCxiY2Nx+/ZtaLVavedWrVploqzKB61Wi4KCgiLrf//9dzg5OZkgo/LlwIEDOHToEIsvIiKqMNhzQWSAiIgIdO7cGbGxsbhz5w7u3r2rt1i6zp07Y8mSJbrHkiQhKysLM2fOxKuvvmq6xMoJFl9ERFTRcEA3kQE8PT0xf/58DB482NSplEu///47unTpAiEELl++jGbNmuHy5cuoUqUKfv31V1StWtXUKZpUv3794OLighUrVsDJyQlnzpyBu7s7unfvDi8vL8TExJg6RSIiolJhcUFkADc3Nxw7dgwvvPCCqVMpt/Lz87Fx40acOXMGWVlZaNKkCQYNGqQ3xsBSsfgiIqKKhsUFkQEmTZoEjUaD6dOnmzoVMlP5+fnYtGkTEhISWHwREZHZY3FBZIBx48Zh7dq1CAwMRGBgIGxsbPSe/+yzz0yUWflx+fJl7Nu3r9gB7zNmzDBRVkRERKQEFhdEBmjfvv1Tn5MkCb/88osRsyl/oqOj8e6776JKlSrw8PCAJEm65yRJwsmTJ02YnemtWbMGVapUwWuvvQYAmDhxIlasWAF/f39s2LABtWvXNnGGREREpcPigsiCNW7cWO8DfyFJkmBnZ4d69eph2LBhzyyinqV27doYM2YMJk2aZGiqFVL9+vXx1VdfoUOHDjh8+DA6duyIJUuW4KeffoK1tTW2bNli6hSJiEhB27ZtK/G2b7zxhoKZyIfFBZEFCw8Px1dffYWGDRvi5ZdfBgD89ttvOHPmDIYNG4bExETExsZiy5Yt6N69e6njOzs74/Tp06hbt67cqVcIDg4OuHjxIry8vDBp0iTcvHkTa9euxfnz5xESEqK7YzcREVVMKpX+XSEkScKTH82f/AKwuKnLyyPeRI/IQMePH8d3332H1NRU5Obm6j1X3r95vnPnDj766KMiA9IjIyNx/fp17N69GzNnzsScOXPKVFz06dMHu3fvxjvvvCNXyhWKRqNBeno6vLy8sHv3bkyYMAEAYGdnh0ePHpk4OyIiUtqTYxH37t2LSZMmYd68eWjZsiUA4PDhw5g2bRrmzZtnqhRLjT0XRAbYuHEjhgwZgi5dumD37t3o3LkzkpKS8Oeff6Jnz57l/j4FLi4uOHHiBOrVq6e3/sqVK2jatCkyMjJw8eJFvPTSS7h//36JYn7++ee6nx88eIDPPvsMr732Gho2bFhkwPsHH3xg+JswY4MGDcLFixfRuHFjbNiwAampqXBzc8O2bdswZcoUnDt3ztQpEhGRkQQEBODrr79GmzZt9NYfOHAAb731Fi5cuGCizEqHPRdEBpg3bx4WL16MsWPHwsnJCUuXLkWdOnXw9ttvw9PT09TpPZednR0OHTpUpLg4dOgQ7OzsADz+VqXw55JYvHix3mONRoP9+/dj//79euslSbL44uKLL77AtGnTkJaWhs2bN8PNzQ0AcOLECQwYMMDE2RERmZcHDx7gk08+QWxsbLEzFF69etVEmZVMcnIyXF1di6x3cXFBSkqK0fMpK/ZcKKBJkyal2l6SJGzbtg01atRQKCNSiqOjI86fPw9vb2+4ubkhLi4ODRs2xIULF9ChQwfcvHnT1Ck+U2RkJObNm4fRo0fjpZdeAvB4zMXKlSsxZcoUTJ06FYsXL8b27duxZ88eE2dLJI8zZ86U+jX+/v6wtub3cUqoaG0mp982nQEDBmD//v0YPHgwPD09i0xYMm7cOBNlVjLt2rWDnZ0d1q1bh2rVqgEA/vzzTwwZMgTZ2dlFvqQrKWOf81hcKEClUuGjjz6CRqN57rZCCHzyySdITEzkoFczVLNmTezYsQMNGzZEYGAgwsPDMWDAABw+fBhdu3ZFRkaGqVN8rm+//RbLli3DpUuXADyewej999/HwIEDAQCPHj3SzR5VWrNnz0ZYWBgcHBz01j969AgLFixgQ4vH3d3Lly/H1atX8f3336NGjRpYt24d6tSpU6RrnOShUqmKDJp83vZJSUk8RyukIrWZnH7btFxdXfHzzz+jdevWpk6lTK5cuYKePXsiKSkJtWrVAgCkpaXBx8cHP/74Y5GrDErK2Oc8FhcKUKlUuHXrFqpWrVqi7Z2cnJCQkFAuT5T0bAMHDkSzZs0wYcIEzJkzB//+97/RvXt37NmzB02aNCn3A7qVZmVlhZs3bxb5W0hPT0fVqlXNZuYLpWzevBmDBw/GoEGDsG7dOt0HpmXLlmH79u3Yvn27qVOskFQqFY4dOwZ3d/fnbiuEQEBAAM6cOcNztEIqUpvJ6bdNq06dOti+fTv8/PxMnUqZCSGwZ88eXLx4EQDg5+eH0NDQYqeNLyljn/PYx6uAa9eulegXWCgxMRHVq1dXMCNSyrJly5CdnQ0AmDp1KmxsbHDo0CH07t0b06ZNM3F2JZebm1tsF76Xl5dBcYUQxZ4QExISULlyZYNiVwSRkZH4+uuvMWTIEGzcuFG3vnXr1oiMjDRhZhVbcHAw6tWrV+y1zcVp164d7O3tlU3KglWkNvPu3bvo06ePqdOwWHPmzMGMGTOwZs2aIj3m5kKSJHTu3BmdO3eWLaaxz3nsuSCyYJcvX8aIESNw6NAhvfWFRUFZexYqVaoESZKQkZEBZ2fnIvN0Z2Vl4Z133sEXX3xR5tyFEEhLS0PVqlXLdMlWeeDg4IDExER4e3vrfRt79epV+Pv76wpXIjIPI0eOxEsvvcTpt02kcePGSE5OhhAC3t7eRWYoNIfL0mJjY586IH3VqlUmyqp02HOhkDt37uDBgweoXbu2bt358+excOFCPHjwAD169NBd007m7/bt28WeCAIDA02UUckMGzYM1tbW+Omnn4od/FZWS5YsgRACI0aMQEREBFxcXHTP2drawtvbWzeHd1kJIVCvXj2cP38ePj4+hqZsEh4eHrhy5Qq8vb311h88eLBcXvJhCfLz85GdnV2i6/9JPhWlzaxXrx6mT5+OI0eOcPptE+jRo4epUzBIREQEZs+ejWbNmsnaJj+LIuc8QYro37+/mDBhgu7xn3/+KSpVqiQaNGgg3njjDWFjYyPWrl1rwgxJDsePHxcNGjQQKpVKSJKkt6hUKlOn91wODg7iwoULisWPi4sTeXl5isX39/cXhw8fViy+0ubNmyf8/f3FkSNHhJOTkzhw4ID45ptvhLu7u/j8889NnV6Ftm3bNhETE6O3LjIyUqjVamFlZSU6deok/v77b9MkZ4EqSpvp7e391KVOnTqmTo/KOQ8PD8X+nxvznMfiQiHe3t4iLi5O93jBggXihRde0H3QWrBggWjevLmp0iOZBAYGip49e4ojR46Ia9euiZSUFL2lvGvWrJk4cOCAovu4cuWKmDp1qujfv7/4888/hRBCbN++XZw7d87g2Nu2bRNt2rQRZ8+eNTiWKWi1WhEZGSkcHR11RamdnZ2YNm2aqVMrkYyMjKc+d/nyZSNmUnohISFi2bJlusfx8fFCpVKJyMhIsXnzZvHiiy+K8ePHmzBDy8I2k+Ry9+5dER0dLSZPnizS09OFEEKcOHFC/P777ybO7PkqV64srly5okhsY57zWFwoxM7OTu/D5SuvvCI+/vhj3eNLly6JypUrmyI1kpFGoyn3H6KeJTY2VrRs2VLs27dP3LlzR2RkZOgthoqLixP29vYiNDRU2NraiuTkZCGEEFFRUaJ3794Gx3d1dRW2trZCpVIJOzs7UalSJb3FXOTk5Ijz58+Lo0ePivv375s6nRJr06aNyM7OLrL+4sWLokaNGibIqOTc3d3FyZMndY/Hjx8vunTponv8888/i3r16pkiNYvENpPkkJCQINzd3UW9evWEtbW1rs2ZOnWqGDx4sImze76JEyeK2bNnKxLbmOc8jrlQiLOzM+7du6e7fvTYsWMYOXKk7nlJkpCTk2Oq9EqsoKAAq1evfurgol9++cVEmZUPHTt2REJCQpnnnja10NBQAI/fx5OEgQO6C02ePBmRkZGYMGECnJycdOs7dOiAZcuWGRQbeDy2oyKwtbWFv7+/qdMoNY1Gg549e2Lbtm26my0V3kCyb9++Js7u2e7fv6+7IzrweJzLk7P8NGjQADdu3DBFahaJbWb5sW7dOnz99de4du0aDh8+jNq1a2PJkiWoU6cOunfvbur0nmnChAkYNmwY5s+fr9fmvPrqq2YxZic7OxsrVqzA3r17ERgYWGTMzmeffVbm2MY857G4UEiLFi3w+eefIzo6Glu2bMH9+/fRoUMH3fNP3iClPBs3bhxWr16N1157DQEBAUYZXGROVq5ciaFDh+LcuXMICAgociJ44403TJRZyezbt0/R+GfPnsX69euLrK9atSru3LljcPyhQ4caHMOUHjx4gE8++eSpH0SuXr1qosxKZsuWLQgNDcWgQYOwceNGnD9/Hh07dsSgQYMMagSNoUaNGrhw4QK8vLyQlZWFhIQELF68WPd8enq62U5laY7YZpYPX331FWbMmIEPP/wQc+fO1X3B5OrqiiVLlpT74uK3337D8uXLi6yvUaMGbt26ZYKMSufMmTNo1KgRAODcuXN6zxn6f8mY5zwWFwqZM2cOOnbsiG+++Qb5+fmYMmUKKlWqpHt+48aNCA4ONmGGJbNx40Z89913ePXVV02dSrl0+PBhxMfHY8eOHUWek+Obf6Up/X/Q1dUVN2/eRJ06dfTWnzp1CjVq1JBlH8nJyYiJiUFycjKWLl2KqlWrYseOHfDy8kKDBg1k2YdSRo0ahf3792Pw4MGKzQzi5eWFkJAQBAcHIyQkBC+88IJsse3t7fHzzz8jJCQEffv2xa+//oohQ4ZgwYIFsu1DKX369MGHH36IKVOmYPv27fDw8ECLFi10zx8/fhz169c3YYaWhW1m+fDvf/8b0dHR6NGjBz755BPd+mbNmiEsLMyg2HXq1HnmOU6OL1PUajUyMzOLrE9KSirVvVRMRckv/Ix5zmNxoZDAwEBcuHAB8fHx8PDwQPPmzfWe79+/v1lcBmFra2u2l/wYw/vvv48333wT06dPR7Vq1UydTomcOXMGAQEBUKlUOHPmzDO3NXQq3f79+2PSpEn4/vvvIUkStFot4uPjERYWhiFDhhgUGwD279+PV155Ba1bt8avv/6KuXPnomrVqkhISMD//d//4YcffjB4H0rasWMHfv75Z7Ru3VqxfcybNw+//vorPv30U4wePRo1atRAcHCwrtgo7TS+/2y4VSoVNm3ahE6dOqF3796YPn26bhtnZ2fZ3ofcZsyYgT/++AMffPABPDw88M0338DKykr3/IYNG/D666+bMEPLwjazfLh27RoaN25cZL1arcaDBw8Miv3hhx/qPc7Ly8OpU6ewc+dOfPzxxwbFLvTGG29g9uzZ+O677wA8/pIvNTUVkyZNQu/evWXZhzFcuXIFycnJupvZiafckLY0jHrOk2XkBlVYCxcuFGPGjBFarVa2mK6urkUG3j5tKe80Go1iMzsoRZIk3axNhVPm/nMaXbmm0s3JyRGjRo0S1tbWQpIkYWNjI1QqlXjzzTdFfn6+wfFbtGghFi1aJIR4/LsoHLx39OjRcj+gWIjHM+QkJiYabX83btwQGzZsEIMGDRLW1tZl+h0X/t/45/Lk/xtzmYqZSG5KtJn/nGjjWYuh/Pz8xI8//iiE0D+nfv7556Jx48YGxy/OsmXLxLBhw2SJde/ePREaGipcXV2FlZWVqFWrlrCxsRHt2rUTWVlZsuxDSXfu3BEdOnTQnUMLj//w4cP1pmou79hzoaD8/HwsXrwYGzZsQFJSEgDA19cXAwcOxLhx44pcn18eHTx4EPv27cOOHTvQoEGDIjlv2bKl1DGfHISbnp6OyMhIdOnSRXdTtcOHD2PXrl2YPn26QbkbQ69evbBv3z5ZLzVR2rVr13Tdw9euXVN0X7a2toiOjsb06dNx7tw5ZGVloXHjxrLd9E7pMR1KmzNnDmbMmIE1a9Yoen3/w4cPcfDgQcTFxWHfvn04deoUAgICEBISUupYSo/TMYUzZ87onaPL+80vKyq2mcVzdXUt8bfWhl6KO2HCBIwdOxbZ2dkQQuDYsWPYsGEDoqKisHLlSoNiP80rr7yC8PBwxMTEGBzLxcUFe/bsQXx8PBISEpCVlYUmTZroJi8p78aPHw8bGxukpqbCz89Pt75fv36YMGECFi1aJMt+lD7nsbhQyKNHj9CpUyccPnwYoaGhaNeuHYDHM6lMmjQJ27Ztw+7du2FnZ2fiTJ/N1dUVPXv2lDXmk4Nwe/fujdmzZ+O9997Trfvggw+wbNky7N27F+PHj5d133Lz9fVFeHg4Dh48aDZ3Y33yDrjXr19Hq1atdDP9FMrPz8ehQ4f0tjWEl5cXvLy8ZIn1JGOM6SiUnZ0t+9/rokWLkJycjGrVqsHb27vI/5+TJ08avI9WrVrh1KlT8PPzQ0hICCZPnox27drpXc9eGoXXvefn52PevHkYMWIEatasaXCeplA4I1FiYiKEEAAeX0bRoEED/N///R9eeuklE2doOdhmPt2TBX1KSgomT56MYcOG6X0ht2bNGkRFRRm8r1GjRsHe3h7Tpk3Dw4cPMXDgQFSvXh1Lly5F//79DY5fnB9++AGVK1eWNWbr1q11l5veu3dP1thK2r17N3bt2lXknOrj44Pr168bHN9Y5zxJFEYnWc2cOROrV6/Gf//73yIVYUJCAt544w0MHz4cs2bNMk2C5YRGo8Hp06eLXKN65coVNGrUCFlZWSbKrGT++aH2SZIkyTJATclpAa2srHDz5k1UrVpVb316ejqqVq0qy7dgxZEkCXZ2dqhXrx66d+9e5oYlLCwMR48exffffw9fX1+cPHkSf/75J4YMGYIhQ4Zg5syZhqQPrVaLuXPn4uuvv8aff/6JpKQk1K1bF9OnT4e3t7feVJllERER8cznDc0fACpXrgyVSoXOnTsjJCQEISEh8PX1NTguADg5OeHs2bPw9vaWJZ4xJSYmonnz5vDz88P48eN13xImJiZi8eLFuHTpEo4cOWIW1/lXBGwzS6Zjx44YNWoUBgwYoLd+/fr1WLFiBeLi4mTb18OHD5GVlVWkfSirxo0b6/XACCFw69Yt/PXXX/jyyy/x1ltvGbyPTz/9FN7e3ujXrx8AoG/fvti8eTM8PDywfft2BAUFGbwPJTk5OeHkyZPw8fGBk5MTEhISULduXRw/fhxdunRBenp6mWMb9ZxnymuyKjJfX1/xww8/PPX57777Tvj4+Bgxo/LJy8tLLFy4sMj6hQsXCi8vLxNkVL58+eWXokqVKiIyMlLY29vrrr+MiYkRISEhBseXJEncvn27yPpLly4JJycng+OHhIQIZ2dn4ejoKJo0aSKaNGkiNBqNcHFxEc2bN9eNvzl//nyZ4is9piMiIkLUrVtXfPPNN3rHf+PGjaJFixYGxzcGrVYrEhISxNKlS0WvXr1ElSpVRPXq1cWAAQPEihUrDIr9xhtviNWrV8uUqXH16dNH9OzZs9hr47VarejRo4fo06ePCTKzTGwzS8be3l4kJSUVWX/p0iVhb29vgoxKbtasWXrL7NmzxVdffSUuXLgg2z68vb1FfHy8EEKI3bt3C1dXV7Fr1y4xcuRI0alTJ9n2o5RXXnlFTJs2TQjxeMzL1atXRUFBgejTp4/BN5415jmPPRcKsbOzw+XLl586L3daWhp8fHyQnZ1t5MxK74cffsB3332H1NRU5Obm6j1n6GUbq1evxqhRo/DKK6/oZgc5evQodu7ciejoaAwbNsyg+MYknuhilIu/vz/mzZuHHj166H2Lce7cOYSEhJR5XEGvXr0AAFu3bkXXrl2hVqt1zxUUFODMmTOoX78+du7caVD+S5YswYEDBxATE6ObOSgjIwOjRo1CmzZtMHr0aAwcOBCPHj3Crl27yryftLQ0nD17VvYxHfXq1cPy5cvRsWNHveN/8eJFtGzZEnfv3pVlP8YihMCJEyewbNkyfPvtt9BqtQb1Tn399deIiIjAoEGD0LRpUzg6Ouo9X57v8+Lu7o4dO3agWbNmxT7/22+/4dVXX8Vff/1l5MwskzHazD///BNhYWG6+8r88+OPXFOHK9lm1q9fH927d8f8+fP11k+cOBFbt27FpUuXDIpvrGOkFHt7e909UcaNG4fs7GwsX74cSUlJaN68ebk/Z587dw4dO3ZEkyZN8Msvv+CNN97A+fPn8ffffyM+Pt6g8Z3GPOdxzIVCnJ2dcfv27aeeKG/duqV398jy6vPPP8fUqVMxbNgwbN26FcOHD0dycjJ+++03jB071uD4w4YNg5+fHz7//HPdQDc/Pz8cPHiwyFSE5dXatWuxYMECXL58GcDjcRgff/wxBg8ebHBspaYFdHFxAfD4w6aTkxPs7e11z9na2qJFixYYPXp0meMXWrBgAfbs2aM3JamLiwtmzZqFzp07Y9y4cZgxYwY6d+5cpvizZ89GWFgYatWqpfe39ujRIyxYsAAzZswwKP8//vij2GkltVot8vLyyhSzcuXKSEpKQpUqVVCpUqVnFqN///13mfbxpJMnTyIuLg5xcXE4ePAg7t+/j4YNG+L99983+L4BY8aMAVD8XWPL+31e7t+//8zpoz08PHD//n0jZmTZjNFmDhs2DKmpqZg+fbpi95VRus1cvHgxevfujR07dujayGPHjuHy5cvYvHmzwfGNcYyAx2PY/ll4yTF1daVKlZCWloZatWph586diIyMBPC4rSvP56NCAQEBSEpKwrJly+Dk5ISsrCz06tULY8eOhaenp0GxjXrOk6X/g4ro27ev6NWr11Of79Wrl1l0udevX1+sX79eCKE/Ld306dPF2LFjTZlaubBo0SLh4OAgJk6cKLZu3Sq2bt0qPv74Y+Hg4CA+++wzg+MrPS3grFmzFJ2ez9HRUezbt6/I+n379gmNRiOEECI5ObnMl2CpVCrdtLpPunPnjixToTZp0kSsW7dOCKF//CMiIkSbNm3KFHP16tUiOztb9/OzFjlYWVmJZs2aiY8++khs27ZN3Lt3T5a45u55l+F8//33wtfX14gZWTZjtJkajUacOnXKoBjPY4w2My0tTYSHh4uePXuKnj17iilTpojU1FRZYit5jLKyssTYsWOFu7t7sdNZy2Hs2LGidu3aIjQ0VLi5uYn79+8LIYTYsGGDYlPpmgtjnvNYXCjk/PnzQqPRiObNm4tNmzaJhIQEcfr0abFhwwbx8ssvC41GI86dO2fqNJ/L3t5epKSkCCGEcHd3F6dPnxZCCJGUlCQqV64syz4KCgrEpUuXxIEDB8T+/fv1lvLO29tbrFmzpsj61atXC29vb4PjR0dHixo1aoiNGzcKR0dHsWHDBhEZGan7ubwbOHCgqFOnjtiyZYtIS0sTaWlpYsuWLaJu3brizTffFEI8Puk3bdq0TPGfNmYkNjZWVKlSxaDchRDixx9/FC4uLuKTTz4RDg4OYsGCBWLUqFHC1tZW7N692+D4xiDH3PcV0YwZM4SXl5c4e/ZskefOnDkjateuLaZPn26CzCyTMdpMPz8/cfLkSZkyLp4x2kwlKXmMxowZI/z8/MQPP/wg7O3txapVq8ScOXNEzZo1xTfffCPLPnJzc8WCBQvEBx98oPc+PvvsMxEdHS3LPpT2999/iwULFogRI0aIESNGiIULF4r09HSD4xrznMfiQkGHDx8W/v7+ejedkiRJ+Pn5iUOHDpk6vRKpU6eO7g+0adOm4uuvvxZCCLFr1y5ZbnJ3+PBhUadOnWJv5GYON+FSq9Xi8uXLRdYnJSUJtVotyz6++eYbUa9ePd1xqVGjhli5cqUssYV4/G1Fnz59RPPmzUXjxo31FkPdv39f92G88G/A1tZWjB49WtdjcurUqVJ/U1Y4EFylUhW5KaOzs7NQqVRizJgxBucvhBC//vqrCA0NFe7u7sLe3l60bt1a7Nq1S5bYQhinuL57966Ijo4WkydP1jVSJ06cEL///rvBsePi4kS3bt3ECy+8IF544QXx+uuvi19//dXguEp79OiRaNWqlbCyshJdu3YV48ePFx9++KHo0qWLsLKyEi1bthSPHj0ydZoWRek2c9euXaJz587i2rVrhif7FEq3mUI8/nvetWuXWLdunVizZo3eYiglj1GtWrV0PdlOTk66tnPt2rXilVdekX1/5mj//v3C2dlZ1KpVS9cz5eXlJZydnQ1uE4x5zmNxYQSnTp0SmzZtEps2bVK8S1ZuI0eOFLNmzRJCPL6Lpr29ve7ulyNGjDA4flBQkOjTp49ITEwUd+/eFffu3dNbyrsGDRqIuXPnFlk/Z84cERAQYFDsvLw8sWbNGnHr1i0hhBAPHjwo9hIgQyxdulRoNBrx3nvvCVtbW/H222+L0NBQ4eLiIqZMmSLbfu7fvy8SEhJEQkKCrpvaEKtXrxYxMTFCkiSxdOlSvUuJ1q9fbzbFuzGK64SEBFGlShVRr149YW1trbtMY+rUqWLw4MEGxV63bp2wtrYWffv2FUuXLhVLly4Vffv2FTY2NuLbb7+VI31F5eTkiE8++UQEBQUJe3t7YW9vL4KCgkRUVJTu0jUyPqXaTFdXV90XHRqNRu9LCbk++CvdZm7btk04OTkJSZKEi4uLcHV11S1yvAclj5Gjo6O4fv26EEKIGjVqiKNHjwohhLh69apwdHQ0OHchHrcNP/30k+7xxx9/LFxcXETLli11PUqG8Pb2FnXq1HnqYqiAgAAxevRovdkO8/PzxVtvvWXwZwohjHfO42xRRpabm4vc3FxoNBpTp1IiWq0WWq1Wd5O1TZs2IT4+Hj4+PnjnnXcMvmOqo6MjEhISih00aw42b96Mfv36ITQ0VHfDnvj4eMTGxuK7774z+GZKDg4OuHDhgmw3s/unF198ETNnzsSAAQP0ZkOaMWMG/v77byxbtky2ff3+++8AYPAN15o0aYLY2FhUqlQJ7du3x3//+1/F/55yc3Nx+/ZtaLVavfWG3hiwUaNG8PX1RURERLGDJwsH3hsiNDQUTZo0wfz58/V+x4cOHcLAgQORkpJS5th+fn546623itzs8rPPPkN0dDQuXLhgYPZk6eRsM9esWfPM55+8wWtZKd1m+vr64tVXX8W8efPg4OBgcL7/pOQxCgwMxL///W8EBwcjNDQUjRo1wsKFC/H5559j/vz5ujbCEPXr18dXX32FDh066G7IuHjxYvz000+wtrYu0x3Sn7R06VK9x3l5eTh16hR27tyJjz/+GJMnTzYovr29PU6fPo369evrrb906RIaNWqER48eGRTfaGQrU6iIVatWiffee093LWF4eLjuG4HQ0FBx584dE2dYMo8ePRJHjx4V//3vf3WDlrdu3Sq2bdtmcOz27duLHTt2yJCl6Zw4cUIMGjRIdx+HQYMGyXbNanBwsPjPf/4jS6ziKH19cEFBgYiIiNBdqqRSqYSLi4uYPXu2KCgoKFNMOzs7kZaWJoR4PKC7uDEXcklKShJt2rQpMvBQrp4FBweHYi+rk5Ozs7O4cuWKEEJ/gGlKSorBl+7Z2toWm//ly5dluyxQKUePHn3mvVCys7PFpk2bjJgRsc18PgcHB93fsLn57LPPxNKlS4UQQuzZs0fY2dkJtVotVCqVWLJkiSz7sLe31/WOTJw4Udc7e+7cOVnG4T3NsmXLxLBhwwyO06pVq2Lb/P/85z+iefPmBsU25jmPU9EqZO7cuZg7dy5at26N9evX4+DBg/jxxx8xe/ZsqFQqfP7555g2bRq++uorU6f6TDt37sTgwYOLvSukHFNNvv/++/joo49w69YtNGzYsMi3Ov+8U2t5M2TIELRv3x4REREGzT/9NGPGjMFHH32E33//vdj7CBh6fDw8PPD333+jdu3a8PLywpEjRxAUFIRr164Vmd+8LKZOnYr/+7//wyeffKLr2Tl48CBmzZqF7OxszJ07t9QxGzVqhOHDh6NNmzYQQmDBggVP/VbT0Klohw0bBmtra/z000+KTMvYvHlzXLlyRdGeO7VajczMzCLrk5KS4O7ublDsWrVqITY2tkj+e/fufeqUouVFy5Yt9e5O7+zsjNOnT6Nu3boAgHv37mHAgAHo27evKdO0GEq1mZmZmbopTov7O3iSHFOhKt1mdunSBcePH9f9P5WDsY7Rkz2coaGhuHjxIk6cOIF69erJ1tZrNBqkp6fDy8sLu3fvxoQJEwA8vo+Kkt/6v/LKKwgPD0dMTEypX3vmzBndzx988AHGjRuHK1euoEWLFgCAI0eO4IsvvsAnn3xiUI5GPefJUqJQEfXq1dNNR/fbb78JlUqlNwXY9u3bzeIO1PXq1RNjxozRXfcvt39eZ25uA7pHjhwpfHx8hEqlEjVr1hSDBg0S0dHRxd5BtSyUPj5KXx/s6ekptm7dWmT9jz/+KKpXr16mmBcvXhT9+vUTzZo1EyqVSgQEBIhGjRoVWeQYkO7g4CDr3WOFELqxJwkJCWLLli3C399fxMTEiOPHj+s9l5CQIMv+Ro4cKXr06CFyc3N1d3y9fv26aNy4sRg3bpxBsb/88ktha2sr3nnnHbF27Vqxdu1a8fbbbwu1Wq0byFpeSZKkN4bpyV4dIYS4deuWkCTJFKlZJKXazCenq35yoLgSPZGF70PJNnPlypXCy8tLzJw5U/zwww96PSPFnWtLwhjHKDc3V3To0EG2tvFpBg4cKJo0aSJGjhwpHBwcdL1dW7duFf7+/ort99NPPxW1a9cu02sLj+2z2ns5/o8a85zHMRcKUavVuHLliu7bO7VarbvrMfD45lx16tQpchOZ8sbZ2RmnTp1S5Ft5ALh+/fozn1dqrIHc/vjjD/z666/Yv38/9u/fj6SkJHh6ehp8DanSx+dZ1we//fbbsLW1NSi+nZ0dzpw5A19fX731cl0/qlKpcOvWLd03MXJ76aWXsHjxYrRp00a2mCqVCpIkPbVnqPA5uW5Cl5GRgX/96184fvw47t+/j+rVq+PWrVto0aIFduzYUaQ3rLT+85//YNGiRbrxFX5+fvj444/RvXt3g3NX0j//7zw5HgV4fKfi6tWrm8WNtyoCpdrM/fv3o3Xr1rC2tsb+/fufua2hN5UElG8zVSrVU58r6znDWMfI3d0dhw4dgo+PT5ljPM+9e/cwffp0pKWl4d1330WXLl0AADNnzoStrS2mTp1qUPzGjRvr9WALIXDr1i389ddf+PLLL/HWW2+VOubz2vknGdLmG/Ocx8uiFJKXlwe1Wq17bGtrq3fJj7W1tayNVmJiIlJTU4uceN944w2D4v7rX/9CXFycYifKwj+U4vKXJEm24kKp41OoUqVKcHNzQ6VKleDq6gpra2uDLzkBlD8+KpUK8fHxWL58Oa5evYrvv/8e/fr1w9q1a3Hs2DGDP1QHBQVh2bJl+Pzzz/XWL1u2DEFBQQbFBqAbYP204/P666+XOuaTlwV8+umnmDhxIubNm1fsZXtluUTg2rVrpX6NIVxcXLBnzx7Ex8cjISEBWVlZaNKkCUJDQw2OPXToUIwcORIHDx6UIVOyZEq1mU9+GA4ODsaBAwewfPlyJCcn44cffkCNGjWwbt061KlTx7A38D9Kt5n/nFRCDsY6Rm+++abuMlmluLq6ok+fPli+fDlmzZqFgIAA1KhRAy+88IIsl5L16NFD77FKpYK7uztCQkLw4osvlilmce240p+JlMbiQkGJiYm4desWgMfV7cWLF5GVlQUAuHPnjiz7uHr1Knr27ImzZ8/qfRtaWFkbWsAsW7YMffr0wYEDB4r9cPXBBx8YFF/p/JWOP2XKFMTFxeHUqVPw8/NDcHAwJk+ejHbt2qFSpUoGxTZG/ps3b8bgwYMxaNAgnDx5Ejk5OQAef8CeN28etm/fblD8+fPn47XXXsPevXvRsmVLAMDhw4eRlpZmcGzg8Qf1Hj16yHp8XF1di3wz1bFjR71tDOlZeLJxiIqKQrVq1TBixAi9bVatWoW//voLkyZNKnX84sTGxiI2NlY349XFixexfv163b7KKiMjA6GhoahduzaGDx+OYcOGoXr16rLkbAzGOEdTySn9+3jyfHfq1Cnd+S4jI0OW8x2gfJs5e/bspz4nSRKmT59uUHwlj1F+fj5WrVqFvXv3FjuG8LPPPjMod+Dp+cvVpu3fvx/t2rXDrFmz9NbfvXsXHTp0wC+//GJQfKXbfKOd82S5uIqKeNY1dHJe49mtWzfRvXt38ddffwmNRiMSExPFgQMHxMsvvyzLjaxWrlwprK2thUajEbVr1xbe3t66RY45nf+Z//nz52XNX+njI0mSqFq1qoiKihKXLl0yON4/KX18GjVqpLvx0pPXX548eVJUq1bN4PjXr18Xf/zxh5gyZYro1auX6NWrl5g6dar4448/dDN6GEKJ329cXJxuWb16tYiNjdVbFxcXJ3755RexevVqg/OvXbu2iI+PL7L+yJEjstzhXQghZs2aJVQqlXj55ZdF9+7dRY8ePfQWQ92+fVssWrRIBAYGCmtra9G1a1fx3XffidzcXBmyV46xztFUMsb4fSh9vhNC+Tbzn2PLGjRoIBwcHISzs7Ms48zkPkYJCQm6mQFDQkKeurRv397g3JXI/58kSRLu7u6ie/fu4sGDB7r1t27dUuQznZxtvjHPeSwuFJKSklKixVBubm66gZ/Ozs7i4sWLQgghYmNjRaNGjQyOX61aNTF37twyTxv6PErnr3T806dPi6VLl4qePXuKKlWqiOrVq4sBAwaI5cuXy1JsKJ2/vb297k6sT56Ik5OTZZlK9MmBgk+6c+eOLCcxpY+P0vmr1Wpx9erVIuvlOv5CCOHh4SHWrl0rS6znOXHihHjvvfeEnZ2dqFKlivjwww8VH8BZVsY6R1PJGOP3ofT5Tgjl28ziZGRkiJ49e8rydy73MXryHFqnTh3FpxNW+ncsSZI4ffq0aN68uQgICNDtS67iQsk2zZjnPF4WpYAzZ84gICDgmQOvnnT+/HnUr19fN6i2NAoKCuDk5AQAqFKlCm7cuIH69eujdu3auHTpUqnj/VNubi769etX4vdSWkrnr3T8oKAgBAUF6bq6ExISsHjxYowdOxZardbgLkyl8/fw8MCVK1fg7e2tt/7gwYOyXJ8qnjJoOSsrC3Z2dgbHV/r4iP9d/vRPcuVfq1YtxMfHF7mWOT4+XrbLi3Jzc9GqVStZYj3LzZs3sWfPHuzZswdWVlZ49dVXcfbsWfj7+2P+/PlFbrRnSsY8R9PzGev3ofT5DlC+zSyOs7MzIiIi8Prrr2Pw4MEGxZL7GLm6uuLatWuoWrUqUlJSFBkz8iRj/I49PT2xf/9+DB8+HC+99BK+//57+Pn5yRJbqTbN2Oc8nikV0LhxY9y6davEA3pbtmypN9dwaQQEBCAhIQF16tRB8+bNMX/+fNja2mLFihWy/CENHToUmzZtwpQpUwyOVRyl81c6vhACp06dQlxcHOLi4nDw4EFkZmYiMDBQlplHlM5/9OjRGDduHFatWgVJknDjxg0cPnwYYWFhBl27Wzi3uCRJmDFjht6dZAsKCnD06FE0atTI0PQVOz5P5j99+nTF8h89ejQ+/PBD5OXloUOHDgAej4+YOHEiPvroI4PjA8CoUaOwfv16g6/FLk5eXh62bduGmJgY7N69G4GBgfjwww8xcOBA3WD3//znPxgxYkS5Ki6MeY6m5zPW70Op892TlG4znyYjIwMZGRkGx5H7GPXu3RvBwcG6+wQ1a9YMVlZWxW579epVQ9NX/Hdc+GWTWq3G+vXrERkZia5du8o2Pk6pNs3Y5zwWFwoQQhT5QPIshkxHO23aNDx48ADA44Fe3bp1Q9u2beHm5oZNmzaVOW6hgoICzJ8/H7t27UJgYGCRwWmGDsBSOn+l41euXBlZWVkICgpCcHAwRo8ejbZt28LV1dXg2IDy+U+ePBlarRYdO3bEw4cP0a5dO6jVaoSFheH9998vc9xTp04BePy3cPbsWb0pbW1tbREUFISwsDCD81fq+Bgr/48//hjp6ekYM2aM7jxgZ2eHSZMmITw83OD4AJCdnY0VK1Zg7969sv8Ne3p6QqvVYsCAATh27FixBVf79u1l+3t4UmhoKK5evVqmDyTGPEfT8xnr96HU+e5JSreZ/5x5TwiBmzdvYt26dXjllVcMig3If4xWrFiBXr164cqVK/jggw8wevRo3TfzSlD6d/zP3vhp06bBz88PQ4cONTh2YTwl2jRjn/N4nwsFhISElPpOvuvXr4enp6cs+//7779RqVIlWe4m3L59+6c+J0mSwTMjFEfO/JWO//PPP6Nt27ay3Nm1pJQ4Prm5ubhy5QqysrLg7+//1Dtel9bw4cOxdOlSsz0+xso/KysLFy5cgL29PXx8fPSm5DSUkn/D69atQ58+fWS5RKy0vvjiC9y5cwczZ84s9WtNfY4mfcb+fSh1vgOUbzP/eQll4VSoHTp0QHh4uGwf3JU4RsOHD8fnn3+uaHFRSKnf8fXr1+Hl5VXk/+v58+dx/Phx2YqMJ8nRphn7b4zFBRERERERycJ4I46IiIiIiKhCY3FBRERERESyYHFhRDk5OZg1a5bujpGMz/iMz/iMX372YYz3QCVn7r9vxmd8S43PMRdGlJmZCRcXF2RkZCgyQJTxGZ/xGb+ixjfGPozxHqjkzP33zfiMb6nx2XNBRERERESyYHFBRERERESy4E30DKDVanHjxg04OTmVaP7gzMxMvX/lxviMz/iMX1HjG2MfpY0vhMD9+/dRvXp1qFT8ru552GYyPuObb/zSnO845sIAv//+O2rVqmXqNIiIyITS0tJQs2ZNU6dR7rHNJDJ/JTnfsefCAIV3mbx+0hvOGmW+terp21CRuEREZJh85OEgthvljsMVQeFxemHMDFiplbmre+BrFxWJW0glaRWN31BzQ9H4a5JeVjS+h8t9ReMDwJ+/1lA0vuvlAkXj2zxQ9v+Q9YM8ReLm5+fg0G8LSnS+Y3FhgMJuXWeNCs5OyhQX1pKNInGJiMhA/+v3L8klPvT/j5OV2k6x4sLG0VaRuIWULi7sNMp+LLNyUOa4F7J2zFU0PgDF/u8UsrZRtriwtlG4uLC2UjR+Sc53vEiUiIiIiIhkweKCiIiIiIhkweKCiIiIiIhkweKCiIiIiIhkweKCiIiIiIhkweKCiIiIiIhkweKCiIiIiIhkYdHFxc6dO9GmTRu4urrCzc0N3bp1Q3JysqnTIiIiIiIySxZdXDx48AATJkzA8ePHERsbC5VKhZ49e0KrLf4GJzk5OcjMzNRbiIiIqCi2mUSWyaLv0N27d2+9x6tWrYK7uzsSExMREBBQZPuoqChEREQYKz0iIiKzxTaTyDJZdM/F5cuXMWDAANStWxfOzs7w9vYGAKSmpha7fXh4ODIyMnRLWlqaEbMlIiIyH2wziSyTRfdcvP7666hduzaio6NRvXp1aLVaBAQEIDc3t9jt1Wo11Gq1kbMkIiIyP2wziSyTxRYX6enpuHTpEqKjo9G2bVsAwMGDB02cFRERERGR+bLY4qJSpUpwc3PDihUr4OnpidTUVEyePNnUaRERERERmS2LHXOhUqmwceNGnDhxAgEBARg/fjwWLFhg6rSIiIiIiMyWxfZcAEBoaCgSExP11gkhTJQNEREREZF5s9ieCyIiIiIikheLCyIiIiIikgWLCyIiIiIikgWLCyIiIiIikgWLCyIiIiIikoVFzxYll4bbh0Flb6dIbNu5VorELeQ99bCi8YmIiJ4kFTxelFBFnaVM4P+58chF0fi/pvsoGt/ZIVvR+HkFyn5mAQBVrrLxJa2y8RUnSSaPy54LIiIiIiKSBYsLIiIiIiKSBYsLIiIiIiKSBYsLIiIiIiKSBYsLIiIiIiKSBYsLIiIiIiKSBYsLIiIiIiKSBYsLIiIiIiKSBYsLIiIiIiKSRbkvLkJCQvD+++/jww8/RKVKlVCtWjVER0fjwYMHGD58OJycnFCvXj3s2LEDAFBQUICRI0eiTp06sLe3R/369bF06VK9mMOGDUOPHj2wcOFCeHp6ws3NDWPHjkVeXp4p3iIRERERUYVQ7osLAFizZg2qVKmCY8eO4f3338e7776LPn36oFWrVjh58iQ6d+6MwYMH4+HDh9BqtahZsya+//57JCYmYsaMGZgyZQq+++47vZj79u1DcnIy9u3bhzVr1mD16tVYvXr1M/PIyclBZmam3kJERERFsc0kskxmUVwEBQVh2rRp8PHxQXh4OOzs7FClShWMHj0aPj4+mDFjBtLT03HmzBnY2NggIiICzZo1Q506dTBo0CAMHz68SHFRqVIlLFu2DC+++CK6deuG1157DbGxsc/MIyoqCi4uLrqlVq1aSr5tIiIis8U2k8gymUVxERgYqPvZysoKbm5uaNiwoW5dtWrVAAC3b98GAHzxxRdo2rQp3N3dodFosGLFCqSmpurFbNCgAaysrHSPPT09da9/mvDwcGRkZOiWtLQ0g98bERFRRcQ2k8gyWZs6gZKwsbHReyxJkt46SZIAAFqtFhs3bkRYWBgWLVqEli1bwsnJCQsWLMDRo0efG1Or1T4zD7VaDbVabchbISIisghsM4ksk1kUF6URHx+PVq1aYcyYMbp1ycnJJsyIiIiIiMgymMVlUaXh4+OD48ePY9euXUhKSsL06dPx22+/mTotIiIiIqIKr8IVF2+//TZ69eqFfv36oXnz5khPT9frxSAiIiIiImWU+8ui4uLiiqxLSUkpsk4Iofs5JiYGMTExes9HRUXpfi5uytklS5aUNUUiIiIiIkIF7LkgIiIiIiLTYHFBRERERESyYHFBRERERESyYHFBRERERESyYHFBRERERESyKPezRZkD27+toLKzUiS299YsReIWujmhlaLxPT87pGh8IiIyL1a5gJWkTOxGjqnKBP6fJo5aReMPcb6jaPyQcz0Ujd++WpKi8QHgB3gqGt/u71xF41tlKhtf9SBbkbhSQU7Jc1AkAyIiIiIisjgsLoiIiIiISBYsLoiIiIiISBYsLoiIiIiISBYsLoiIiIiISBYsLoiIiIiISBYsLv5n9erVcHV1NXUaRERERERmi8UFERERERHJgsUFERERERHJwiyLi507d6JNmzZwdXWFm5sbunXrhuTkZABASkoKJEnCli1b0L59ezg4OCAoKAiHDx/Wi7F69Wp4eXnBwcEBPXv2RHp6uineChERERFRhWGWxcWDBw8wYcIEHD9+HLGxsVCpVOjZsye0Wq1um6lTpyIsLAynT5+Gr68vBgwYgPz8fADA0aNHMXLkSLz33ns4ffo02rdvj8jIyOfuNycnB5mZmXoLERERFcU2k8gyWZs6gbLo3bu33uNVq1bB3d0diYmJ0Gg0AICwsDC89tprAICIiAg0aNAAV65cwYsvvoilS5eia9eumDhxIgDA19cXhw4dws6dO5+536ioKERERCjwjoiIiCoWtplElsksey4uX76MAQMGoG7dunB2doa3tzcAIDU1VbdNYGCg7mdPT08AwO3btwEAFy5cQPPmzfVitmzZ8rn7DQ8PR0ZGhm5JS0sz9K0QERFVSGwziSyTWfZcvP7666hduzaio6NRvXp1aLVaBAQEIDc3V7eNjY2N7mdJkgBA77KpslCr1VCr1QbFICIisgRsM4ksk9kVF+np6bh06RKio6PRtm1bAMDBgwdLFcPPzw9Hjx7VW3fkyBHZciQiIiIiskRmV1xUqlQJbm5uWLFiBTw9PZGamorJkyeXKsYHH3yA1q1bY+HChejevTt27dr13PEWRERERET0bGY35kKlUmHjxo04ceIEAgICMH78eCxYsKBUMVq0aIHo6GgsXboUQUFB2L17N6ZNm6ZQxkRERERElsHsei4AIDQ0FImJiXrrhBDF/gwArq6uRdaNGDECI0aM0Fv30UcfyZwpEREREZHlMLueCyIiIiIiKp9YXBARERERkSxYXBARERERkSxYXBARERERkSxYXBARERERkSzMcrao8sbhD8DKVpnYVlk5ygT+H5ssjaLx8zs0VTS+9S8nFI1PRETyynUCrBS6cff+e/WVCfw/lW0eKBp/SYGybXJmtrJ3TP8z11nR+AAU/1o8u7JCH+j+x8ZG2TdgbafMR/v8/JLHZc8FERERERHJgsUFERERERHJgsUFERERERHJgsUFERERERHJgsUFERERERHJgsUFERERERHJgsUFERERERHJgsUFERERERHJgsUFERERERHJwqKLi507d6JNmzZwdXWFm5sbunXrhuTkZFOnRURERERkliy6uHjw4AEmTJiA48ePIzY2FiqVCj179oRWqy12+5ycHGRmZuotREREVBTbTCLLZG3qBEypd+/eeo9XrVoFd3d3JCYmIiAgoMj2UVFRiIiIMFZ6REREZottJpFlsuiei8uXL2PAgAGoW7cunJ2d4e3tDQBITU0tdvvw8HBkZGTolrS0NCNmS0REZD7YZhJZJovuuXj99ddRu3ZtREdHo3r16tBqtQgICEBubm6x26vVaqjVaiNnSUREZH7YZhJZJostLtLT03Hp0iVER0ejbdu2AICDBw+aOCsiIiIiIvNlscVFpUqV4ObmhhUrVsDT0xOpqamYPHmyqdMiIiIiIjJbFjvmQqVSYePGjThx4gQCAgIwfvx4LFiwwNRpERERERGZLYvtuQCA0NBQJCYm6q0TQpgoGyIiIiIi82axPRdERERERCQvFhdERERERCQLFhdERERERCQLFhdERERERCQLFhdERERERCQLi54tSi7uJ+/D2qr4u3ob7MafysT9H7t7lZWNf/UvReNfndVK0fhesw4pGp+IyNI43BawslVmZsYvasYqErdQhlahtv5//tZaKRo/p46NovHfcEpQND4A/PZXY0XjOyXdUzS+9DBb0fgi66EygUvxf589F0REREREJAsWF0REREREJAsWF0REREREJAsWF0REREREJAsWF0REREREJAsWF0REREREJAsWF0REREREJAsWF0REREREJAsWF0REREREJAvZi4uffvoJrq6uKCgoAACcPn0akiRh8uTJum1GjRqFN998EwCwefNmNGjQAGq1Gt7e3li0aJFePG9vb0RGRmLIkCHQaDSoXbs2tm3bhr/++gvdu3eHRqNBYGAgjh8/rntNeno6BgwYgBo1asDBwQENGzbEhg0b9OKGhITggw8+wMSJE1G5cmV4eHhg1qxZch8OIiIiIiKLIXtx0bZtW9y/fx+nTp0CAOzfvx9VqlRBXFycbpv9+/cjJCQEJ06cQN++fdG/f3+cPXsWs2bNwvTp07F69Wq9mIsXL0br1q1x6tQpvPbaaxg8eDCGDBmCN998EydPnsQLL7yAIUOGQAgBAMjOzkbTpk3x888/49y5c3jrrbcwePBgHDt2TC/umjVr4OjoiKNHj2L+/PmYPXs29uzZ89T3lpOTg8zMTL2FiIiIimKbSWSZZC8uXFxc0KhRI10xERcXh/Hjx+PUqVPIysrCH3/8gStXriA4OBifffYZOnbsiOnTp8PX1xfDhg3De++9hwULFujFfPXVV/H222/Dx8cHM2bMQGZmJl566SX06dMHvr6+mDRpEi5cuIA///wTAFCjRg2EhYWhUaNGqFu3Lt5//3107doV3333nV7cwMBAzJw5Ez4+PhgyZAiaNWuG2NjYp763qKgouLi46JZatWrJe/CIiIgqCLaZRJZJkTEXwcHBiIuLgxACBw4cQK9eveDn54eDBw9i//79qF69Onx8fHDhwgW0bt1a77WtW7fG5cuXdZdVAY+LgELVqlUDADRs2LDIutu3bwMACgoKMGfOHDRs2BCVK1eGRqPBrl27kJqaqrevJ+MCgKenpy5GccLDw5GRkaFb0tLSSnNYiIiILAbbTCLLZK1E0JCQEKxatQoJCQmwsbHBiy++iJCQEMTF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88/x+eefy5MsEREREZGFMYvi4u7du4iLi0NcXBy+/PJLU6dDRERERETFMIvionHjxrh79y4+/fRT1K9f39TpEBERERFRMcyiuEhJSTF1CkRERERE9BxmM6CbiIiIiIjKNxYXREREREQkC7O4LKrc0xYAEuu0CqmYmcbMicjPUzS+NjNL0fgA8KCasn9bVc5lKxoff9xSNLzmWpqi8W+/3VLR+FWWH1Y0PpU/2kfZ0EoFygQ383O20oTW1BkYTvvokbI7kCRlw9so+9Fb9UiZNk2lzS35topkQEREREREFofFBRERERERyYLFBRERERERyYLFBRERERERyYLFBRERERERyYLFBRERERERyYLFBRERERERyYLFBRERERERyYLFBRERERERyYLFBRERERERyULZe5BXMDk5OcjJydE9zszMNGE2RERE5RfbTCLLxJ6LUoiKioKLi4tuqVWrlqlTIiIiKpfYZhJZJhYXpRAeHo6MjAzdkpaWZuqUiIiIyiW2mUSWiZdFlYJarYZarTZ1GkREROUe20wiy8SeCyIiIiIikgWLiycsW7YMHTt2NHUaRERERERmicXFE+7cuYPk5GRTp0FEREREZJZYXDxh1qxZSElJMXUaRERERERmicUFERERERHJgsUFERERERHJgsUFERERERHJgsUFERERERHJgsUFERERERHJgnfoJqrIhFA2fF6uovEBoNq/Dym+DyUVmDoBA1WJPqZo/I1pyv5++9dqpWh8Kr2H3ZrC2sZOkdjWj7SKxNVR+Jxqlats/lorSdH4qgJljw8AFNgq+734Aw8bReND2V8B8hyU2UFBbjYQXbJt2XNBRERERESyYHFBRERERESyYHFBRERERESyYHFBRERERESyYHFBRERERESyYHFBRERERESyMHlxERISAkmSIEkSTp8+bbE5EBERERGZO5MXFwAwevRo3Lx5EwEBAUhJSdF90P/ncuTIEd1rHj16hJkzZ8LX1xdqtRpVqlRBnz59cP78eb3YDx8+RHh4OF544QXY2dnB3d0dwcHB2Lp1q26bLVu24NgxZedyJyIiIiKq6MrFTfQcHBzg4eGht27v3r1o0KCB3jo3NzcAQE5ODkJDQ5GamopFixahefPm+PPPPxEVFYXmzZtj7969aNGiBQDgnXfewdGjR/Hvf/8b/v7+SE9Px6FDh5Cenq6L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",
      "text/plain": [
       "<Figure size 1000x500 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "['man in a white boat on a small boat in a lake.',\n",
       " 'a man with a bucket and a girl with a hat on the beach.',\n",
       " \"three men on horses are watching a third person's feet in a desert.\",\n",
       " 'a man and a woman are eating together after the chinese new york.']"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import re\n",
    "from fastBPE import fastBPE\n",
    "from sacremoses import MosesDetokenizer, MosesTokenizer\n",
    "\n",
    "# `MosesTokenizer` 和 `MosesDetokenizer` 是来自 `sacremoses` 库的工具，用于自然语言处理中的分词（Tokenization）和去标记化（Detokenization）。这些工具主要用于对文本进行预处理和后处理，通常在处理自然语言处理任务时会用到。\n",
    "#\n",
    "# ### MosesTokenizer：\n",
    "# - **作用**：将原始文本分割成单词和标点符号。\n",
    "# - **特点**：基于 Moses 翻译工具中使用的分词方法。\n",
    "# - **功能**：\n",
    "#   - 将句子分割成单词和标点符号。\n",
    "#   - 处理缩写、连字符、标点等特殊情况。\n",
    "#   - 对文本进行标记化，方便后续处理。\n",
    "#\n",
    "# ### MosesDetokenizer：\n",
    "# - **作用**：将分词后的文本重新组合成原始的句子。\n",
    "# - **特点**：用于对分词后的文本进行还原，使其恢复为可读的句子形式。\n",
    "# - **功能**：\n",
    "#   - 将分词后的单词和标点符号重新组合成句子。\n",
    "#   - 处理分词后的标点、缩写等情况，使得结果更加自然和可读。\n",
    "#\n",
    "# 这些工具通常在文本预处理和后处理过程中使用，对输入的文本进行标记化和去标记化，是一种常用的处理方式。在自然语言处理任务中，对文本进行正确的分词和还原是很重要的，而 `MosesTokenizer` 和 `MosesDetokenizer` 提供了方便、高效的工具来处理这些任务。\n",
    "\n",
    "class Translator:\n",
    "    def __init__(self, model, src_tokenizer, trg_tokenizer):\n",
    "        self.bpe = fastBPE(\"./wmt16/bpe.20000\", \"./wmt16/vocab\")\n",
    "        self.mose_tokenizer = MosesTokenizer(lang=\"de\")\n",
    "        self.mose_detokenizer = MosesDetokenizer(lang=\"en\")\n",
    "        self.model = model\n",
    "        self.model.eval()\n",
    "        self.src_tokenizer = src_tokenizer\n",
    "        self.trg_tokenizer = trg_tokenizer\n",
    "        self.pattern = re.compile(r'(@@ )|(@@ ?$)')\n",
    "\n",
    "    def draw_attention_map(self, attn_scores, cross_attn_scores, src_words_list, trg_words_list):\n",
    "        \"\"\"绘制注意力热力图\n",
    "        attn_scores (numpy.ndarray): 表示自注意力机制（self-attention）分数。\n",
    "        cross_attn_scores (numpy.ndarray): 表示交叉注意力机制的注意力分数。\n",
    "        src_words_list (list): 源语言句子的单词列表。\n",
    "        trg_words_list (list): 目标语言句子的单词列表。\n",
    "        \"\"\"\n",
    "        assert len(attn_scores.shape) == 3, \"attn_scores shape should be \" \\\n",
    "            f\"[num heads, target sequence length, target sequence length], but got {attn_scores.shape}\"\n",
    "        attn_scores = attn_scores[:, :len(trg_words_list), :len(trg_words_list)]\n",
    "\n",
    "        assert len(cross_attn_scores.shape) == 3, \"attn_scores shape should be \" \\\n",
    "            f\"[num heads, target sequence length, source sequence length], but got {cross_attn_scores.shape}\"\n",
    "        cross_attn_scores = cross_attn_scores[:, :len(trg_words_list), :len(src_words_list)]\n",
    "\n",
    "        num_heads, trg_len, src_len = cross_attn_scores.shape\n",
    "\n",
    "        fig = plt.figure(figsize=(10, 5), constrained_layout=True) # constrained_layout=True 自动调整子图参数，使之填充整个图像区域\n",
    "        grid = plt.GridSpec(trg_len, trg_len + src_len, wspace=0.1, hspace=0.1)# wspace,hspace 控制子图之间的间距\n",
    "        #下面是attn_scores的热力图\n",
    "        self_map = fig.add_subplot(grid[:,:trg_len]) #  添加子图\n",
    "        self_map.matshow(attn_scores.mean(dim=0), cmap='viridis') # 绘制热力图，cmap表示颜色,dim=0表示对第0维求均值\n",
    "        self_map.set_yticks(range(trg_len), trg_words_list, fontsize=10)\n",
    "        self_map.set_xticks(range(trg_len), [\"[BOS]\"] + trg_words_list[:-1], rotation=90)\n",
    "        #下面是cross_attn_scores的热力图\n",
    "        cross_map = fig.add_subplot(grid[:, trg_len:])\n",
    "        cross_map.matshow(cross_attn_scores.mean(dim=0), cmap='viridis')\n",
    "        cross_map.set_yticks(range(trg_len), [], fontsize=6)\n",
    "        cross_map.set_xticks(range(src_len), src_words_list, rotation=90)\n",
    "\n",
    "        plt.show()\n",
    "\n",
    "    def draw_attention_maps(self, attn_scores, cross_attn_scores, src_words_list, trg_words_list, heads_list):\n",
    "        \"\"\"绘制注意力热力图\n",
    "\n",
    "        Args:\n",
    "            - scores (numpy.ndarray): shape = [source sequence length, target sequence length]\n",
    "        \"\"\"\n",
    "        assert len(attn_scores.shape) == 3, \"attn_scores shape should be \" \\\n",
    "            f\"[num heads, target sequence length, target sequence length], but got {attn_scores.shape}\"\n",
    "        attn_scores = attn_scores[:, :len(trg_words_list), :len(trg_words_list)]\n",
    "\n",
    "        assert len(cross_attn_scores.shape) == 3, \"attn_scores shape should be \" \\\n",
    "            f\"[num heads, target sequence length, source sequence length], but got {cross_attn_scores.shape}\"\n",
    "        cross_attn_scores = cross_attn_scores[:, :len(trg_words_list), :len(src_words_list)]\n",
    "        # cross_attn_scores = cross_attn_scores[:, :len(src_words_list), :len(src_words_list)]\n",
    "\n",
    "        num_heads, trg_len, src_len = cross_attn_scores.shape\n",
    "        fig, axes = plt.subplots(2, len(heads_list), figsize=(5 * len(heads_list), 10))\n",
    "        for i, heads_idx in enumerate(heads_list):\n",
    "            axes[0, i].matshow(attn_scores[heads_idx], cmap='viridis')\n",
    "            axes[0, i].set_yticks(range(trg_len), trg_words_list)\n",
    "            axes[0, i].set_xticks(range(trg_len), [\"[BOS]\"] + trg_words_list[:-1], rotation=90)\n",
    "            axes[0, i].set_title(f\"head {heads_idx}\")\n",
    "            axes[1, i].matshow(cross_attn_scores[heads_idx], cmap='viridis')\n",
    "            axes[1, i].set_yticks(range(trg_len), trg_words_list)\n",
    "            axes[1, i].set_xticks(range(src_len), src_words_list, rotation=90)\n",
    "            axes[1, i].set_title(f\"head {heads_idx}\")\n",
    "\n",
    "        plt.show()\n",
    "\n",
    "\n",
    "    def __call__(self, sentence_list, heads_list=None, layer_idx=-1):\n",
    "        # 将输入句子列表转换为小写，并使用 MosesTokenizer 进行分词处理。\n",
    "        sentence_list = [\" \".join(self.mose_tokenizer.tokenize(s.lower())) for s in sentence_list]\n",
    "        # 将分词后的结果进行 BPE 编码，得到 tokens_list。\n",
    "        tokens_list = [s.split() for s in self.bpe.apply(sentence_list)]\n",
    "        # 使用 src_tokenizer 对 tokens_list 进行编码，同时添加起始标记 ([BOS]) 和结束标记 ([EOS])。\n",
    "        encoder_input, attn_mask = self.src_tokenizer.encode(\n",
    "            tokens_list,\n",
    "            add_bos=True,\n",
    "            add_eos=True,\n",
    "            return_mask=True,\n",
    "            )\n",
    "        encoder_input = torch.Tensor(encoder_input).to(dtype=torch.int64)\n",
    "        # 使用模型的 infer 方法对编码器输入进行推理，得到输出结果 outputs\n",
    "        outputs = model.infer(encoder_inputs=encoder_input, encoder_inputs_mask=attn_mask)\n",
    "\n",
    "        preds = outputs.preds.numpy()\n",
    "        # 使用目标语言的 trg_tokenizer 对预测序列进行解码，得到解码后的目标语言句子列表 trg_decoded。\n",
    "        trg_decoded = self.trg_tokenizer.decode(preds, split=True, remove_eos=False, remove_bos=False, remove_pad=False)\n",
    "        # 使用源语言的 src_tokenizer 对编码器输入进行解码，得到解码后的源语言句子列表 src_decoded。为下面绘制热力图做准备。\n",
    "        src_decoded = self.src_tokenizer.decode(\n",
    "            encoder_input.numpy(),\n",
    "            split=True,\n",
    "            remove_bos=False,\n",
    "            remove_eos=False\n",
    "            )\n",
    "\n",
    "        # post processed attn scores\n",
    "        # outputs.decoder_attentions[-1]  # the last layer of self-attention scores\n",
    "\n",
    "        # draw the attention map of the last decoder block\n",
    "        for attn_score, cross_attn_score, src, trg in zip(\n",
    "            outputs.decoder_self_attn_scores[layer_idx], outputs.decoder_cross_attn_scores[layer_idx], src_decoded, trg_decoded):\n",
    "            if heads_list is None:# 如果没有指定heads_list，就画单个热力图\n",
    "                self.draw_attention_map(\n",
    "                    attn_score,\n",
    "                    cross_attn_score,\n",
    "                    src,\n",
    "                    trg,\n",
    "                )\n",
    "            else:# 如果指定了heads_list，就画多个热力图\n",
    "                self.draw_attention_maps(\n",
    "                    attn_score,\n",
    "                    cross_attn_score,\n",
    "                    src,\n",
    "                    trg,\n",
    "                    heads_list=heads_list,\n",
    "                    )\n",
    "        return [self.mose_detokenizer.tokenize(self.pattern.sub(\"\", s).split()) for s in self.trg_tokenizer.decode(preds)] #将解码后的目标语言句子列表返回，并使用 mose_detokenizer 进行去标记化，最终得到翻译后的结果。\n",
    "\n",
    "\n",
    "# sentence_list = [\n",
    "#     \"Mann in einem kleinen weißen Boot auf einem See.\",  # Man in a small white boat on a lake.\n",
    "#     \"Ein Mann mit einem Eimer und ein Mädchen mit einem Hut am Strand.\", # A man with a bucket and a girl in a hat on the beach.\n",
    "#     \"Drei Männer auf Pferden während eines Rennens.\",  # Three men on horses during a race.\n",
    "#     \"Ein Mann und eine Frau essen zu Abend\",  # 一个男人和一个女人在吃晚餐\n",
    "# ]\n",
    "sentence_list = [\n",
    "    \"Mann in einem kleinen weißen Boot auf einem See.\",  # Man in a small white boat on a lake.\n",
    "    \"Ein Mann mit einem Eimer und ein Mädchen mit einem Hut am Strand.\", # A man with a bucket and a girl in a hat on the beach.\n",
    "    \"Drei Männer auf Pferden während eines Rennens.\",  # Three men on horses during a race.\n",
    "    \"Ein Mann und eine Frau essen zu Abend\",  # A man and a woman eating dinner\n",
    "]\n",
    "\n",
    "# load checkpoints\n",
    "model = TransformerModel(config)\n",
    "model.load_state_dict(state_dict)\n",
    "translator = Translator(model.cpu(), tokenizer, tokenizer)\n",
    "translator(\n",
    "    sentence_list,\n",
    "    layer_idx=-1,\n",
    "    # heads_list=[0, 1, 2, 3, 4, 5, 6, 7]\n",
    "    )\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "execution": {
     "iopub.status.busy": "2025-01-22T08:58:14.585829Z",
     "iopub.status.idle": "2025-01-22T08:58:14.585997Z",
     "shell.execute_reply": "2025-01-22T08:58:14.585919Z",
     "shell.execute_reply.started": "2025-01-22T08:58:14.585911Z"
    },
    "id": "e0WkUQuUe-Cy",
    "outputId": "433e3d70-4f34-4376-e4a3-1b8834e71f88"
   },
   "outputs": [],
   "source": [
    "!ls checkpoints"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "execution": {
     "iopub.status.busy": "2025-01-22T08:58:14.586647Z",
     "iopub.status.idle": "2025-01-22T08:58:14.586812Z",
     "shell.execute_reply": "2025-01-22T08:58:14.586739Z",
     "shell.execute_reply.started": "2025-01-22T08:58:14.586731Z"
    },
    "id": "_1ZLtdahywWf",
    "tags": []
   },
   "outputs": [],
   "source": [
    "# prompt: 把best.ckpt复制到云盘内\n",
    "\n",
    "!cp -r checkpoints/translate-transformer-not-share/best.ckpt /content/drive/MyDrive/transformer-de-en\n"
   ]
  }
 ],
 "metadata": {
  "accelerator": "GPU",
  "colab": {
   "gpuType": "T4",
   "provenance": []
  },
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.14"
  },
  "widgets": {
   "application/vnd.jupyter.widget-state+json": {
    "00fe6a550df547cea5b1e0d84c1a3f5f": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "FloatProgressModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "FloatProgressModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "ProgressView",
      "bar_style": "success",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_83f345f7424c43929d7a304cbfb6d0fe",
      "max": 9714,
      "min": 0,
      "orientation": "horizontal",
      "style": "IPY_MODEL_58d69d086f644e89937347e1f9261d6f",
      "value": 9714
     }
    },
    "013d2a6b90144432bbfb15136235faba": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "0b7866c29e5f4afe9b92de15f1b88c3e": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "0c0c7229347b49ffbb9a0f7bd41199b9": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "0e10428326bc436e8dbc079e89570bde": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "ProgressStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "ProgressStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "bar_color": null,
      "description_width": ""
     }
    },
    "0fe4ed7283c04496affe727c235d31c4": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "19f846338f6b48c9930b58575641e5b8": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "20a27d1ec76f4d85b1ffe99401fbb5b7": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "22484000400842f0b6e245dc610acbba": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "22aa774ab39e4fd78b0ff08d430d2b5d": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "FloatProgressModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "FloatProgressModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "ProgressView",
      "bar_style": "success",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_4e64bcb87e584beda0408a0aa5a659ae",
      "max": 1,
      "min": 0,
      "orientation": "horizontal",
      "style": "IPY_MODEL_b077d7562d814df5b6d839464dd4122f",
      "value": 1
     }
    },
    "2b82e42c34804b13bc83be4c7009d4e2": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "333e84a304184c57af1821620ae80f6a": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "40f7e3754ad44b33acfe0a80b3648a3a": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HBoxModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HBoxModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HBoxView",
      "box_style": "",
      "children": [
       "IPY_MODEL_b1e51beac50f4947a9dd235d8aa87603",
       "IPY_MODEL_8cd9e9702e114ebc856f56975544ede8",
       "IPY_MODEL_b7c7a718a8654956947108969557ca83"
      ],
      "layout": "IPY_MODEL_20a27d1ec76f4d85b1ffe99401fbb5b7"
     }
    },
    "434ac4c51db74681942d2d3bd869b1df": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "46a51a1719d8444eb5877720253d3c37": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "4e64bcb87e584beda0408a0aa5a659ae": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": "20px"
     }
    },
    "55146ac7395840dca847e0f63aa80561": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HBoxModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HBoxModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HBoxView",
      "box_style": "",
      "children": [
       "IPY_MODEL_abb9bc76c0ce4634bd340be20c074b8c",
       "IPY_MODEL_a89d790df59245fcaf26335d4903c9b4",
       "IPY_MODEL_f837255914194dc792cf1514dee03dc5"
      ],
      "layout": "IPY_MODEL_46a51a1719d8444eb5877720253d3c37"
     }
    },
    "58d69d086f644e89937347e1f9261d6f": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "ProgressStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "ProgressStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "bar_color": null,
      "description_width": ""
     }
    },
    "5a28babf4e2e4393bdc1a093034885ab": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "673bd3773a374261a01cfc48081c27f3": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "7190c928edb040c3a523cdd2e3f45572": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HBoxModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HBoxModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HBoxView",
      "box_style": "",
      "children": [
       "IPY_MODEL_990741ff083d457587665d8f620b69c3",
       "IPY_MODEL_00fe6a550df547cea5b1e0d84c1a3f5f",
       "IPY_MODEL_fab8b1e3187841ee894b92859fa4821b"
      ],
      "layout": "IPY_MODEL_f9b0d916e1a64c2a9f384e42f3d5dcab"
     }
    },
    "7d293204dc1b4d97bb5ee670787c7b7d": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "83f345f7424c43929d7a304cbfb6d0fe": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "8cd9e9702e114ebc856f56975544ede8": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "FloatProgressModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "FloatProgressModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "ProgressView",
      "bar_style": "danger",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_22484000400842f0b6e245dc610acbba",
      "max": 128,
      "min": 0,
      "orientation": "horizontal",
      "style": "IPY_MODEL_a66a5b4ff37d4dafa4ba3081aa1359f4",
      "value": 12
     }
    },
    "8cf462fa996c41b18fb4571e0a757363": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "9233439bdd6746c28ad4a20ef47799f6": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "990741ff083d457587665d8f620b69c3": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_a78199650ecc47bd81f482a2671b563a",
      "placeholder": "​",
      "style": "IPY_MODEL_673bd3773a374261a01cfc48081c27f3",
      "value": "100%"
     }
    },
    "9a01f02fb99b4b81ac487d23bc5daf4a": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_5a28babf4e2e4393bdc1a093034885ab",
      "placeholder": "​",
      "style": "IPY_MODEL_be07d518c21149d196c610fd57b1eaec",
      "value": " 957/? [00:18&lt;00:00, 51.31it/s]"
     }
    },
    "a66a5b4ff37d4dafa4ba3081aa1359f4": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "ProgressStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "ProgressStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "bar_color": null,
      "description_width": ""
     }
    },
    "a78199650ecc47bd81f482a2671b563a": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "a89d790df59245fcaf26335d4903c9b4": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "FloatProgressModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "FloatProgressModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "ProgressView",
      "bar_style": "success",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_9233439bdd6746c28ad4a20ef47799f6",
      "max": 280,
      "min": 0,
      "orientation": "horizontal",
      "style": "IPY_MODEL_0e10428326bc436e8dbc079e89570bde",
      "value": 280
     }
    },
    "a972aba7913b48c6973ae27bff5b9d1d": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_7d293204dc1b4d97bb5ee670787c7b7d",
      "placeholder": "​",
      "style": "IPY_MODEL_ea8fa440f320435aa75c9bef75bc3f08",
      "value": ""
     }
    },
    "abb9bc76c0ce4634bd340be20c074b8c": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_013d2a6b90144432bbfb15136235faba",
      "placeholder": "​",
      "style": "IPY_MODEL_2b82e42c34804b13bc83be4c7009d4e2",
      "value": ""
     }
    },
    "b077d7562d814df5b6d839464dd4122f": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "ProgressStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "ProgressStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "bar_color": null,
      "description_width": ""
     }
    },
    "b1e51beac50f4947a9dd235d8aa87603": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_e0ddf3970b3e4248bc87d4649fa9c448",
      "placeholder": "​",
      "style": "IPY_MODEL_d7bdde54e2534c49a207540bd258d3ae",
      "value": "  9%"
     }
    },
    "b7c7a718a8654956947108969557ca83": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_0b7866c29e5f4afe9b92de15f1b88c3e",
      "placeholder": "​",
      "style": "IPY_MODEL_333e84a304184c57af1821620ae80f6a",
      "value": " 12/128 [00:00&lt;00:01, 73.96it/s]"
     }
    },
    "be07d518c21149d196c610fd57b1eaec": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "c9db4cd83b7b4f53a0fa93b8c365debd": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HBoxModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HBoxModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HBoxView",
      "box_style": "",
      "children": [
       "IPY_MODEL_a972aba7913b48c6973ae27bff5b9d1d",
       "IPY_MODEL_22aa774ab39e4fd78b0ff08d430d2b5d",
       "IPY_MODEL_9a01f02fb99b4b81ac487d23bc5daf4a"
      ],
      "layout": "IPY_MODEL_19f846338f6b48c9930b58575641e5b8"
     }
    },
    "d7bdde54e2534c49a207540bd258d3ae": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "e0ddf3970b3e4248bc87d4649fa9c448": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "ea8fa440f320435aa75c9bef75bc3f08": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "f837255914194dc792cf1514dee03dc5": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_0fe4ed7283c04496affe727c235d31c4",
      "placeholder": "​",
      "style": "IPY_MODEL_0c0c7229347b49ffbb9a0f7bd41199b9",
      "value": " 21020/? [21:30&lt;00:00, 15.32it/s, epoch=19, loss=2.61, val_loss=3.41]"
     }
    },
    "f9b0d916e1a64c2a9f384e42f3d5dcab": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "fab8b1e3187841ee894b92859fa4821b": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_8cf462fa996c41b18fb4571e0a757363",
      "placeholder": "​",
      "style": "IPY_MODEL_434ac4c51db74681942d2d3bd869b1df",
      "value": " 9714/9714 [00:00&lt;00:00, 236744.37it/s]"
     }
    }
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
